簡體   English   中英

查找頻譜圖的峰

[英]Finding the peaks of a spectrogram

我目前正在從事第二年的項目。 我應該在Java調諧器中編寫代碼。 我選擇做吉他調音器。

在網上瀏覽后,我發現了一個Java代碼來執行FFT。 我對其進行了一些更改,了解並進行了測試。 我知道它可以正常工作(我制作了一個圖表,並使用簡單的正弦函數查看了不同的峰)。

我現在正試圖找到基本頻率。 據我了解,該頻率由第一個峰值給出。

因此,我想創建一種方法,例如查找FFT的前5個峰值,並將其與索引一起提供給我。

我首先做了一個簡單的方法,我比較了頻譜圖的每個點乘以兩個,然后當符號改變時才知道有一個峰值。 此方法適用於理想信號(無任何噪聲)。 但是,如果添加噪音,它將變得完全無用。

我對Java真的很不好(我實際上是從這個項目開始的,基本上,我上面描述的簡單功能是我的傑作。...只是讓您了解我的水平)。

誰能幫我? 我真的很感激! :) 提前致謝!

祝你有美好的一天!

火天使

我想說,您最好的選擇是將所有值作為一個數組讀取,然后遍歷它們並使用某種滾動平均值“平滑”它們。

之后,您將獲得一條更加平滑的曲線。 查找使用該曲線的峰值,然后回到自己的原始數據,並使用峰值指標在那里找個實際的峰值。

偽代碼:

// Your raw data
int[] data = getData();

// This is an array to hold your 'smoothed' data
int[] newData = new int[data.length]; 

// Iterate over your data, smooth it, and read it into your smoothed array
for (i <  data.length) {
    newData[i] = (data[i-2] + data[i-1] + data[i] + data[i+1] + data[i+2]) / 5;
}

// Use your existing peak finding function on your smoothed data, and get 
// another array of the indexes your peaks occur.
int[] peakIndexes = yourPeakFindingFunction(newData);

// Create an array to hold your final values.
int[] peakValues = new int[peakIndexes.length];

// Iterate over your peak indexes and get the original data's value at that location.
for(i < peakIndexes.length) {
    peadValues[i] = data[peakIndexes[i]];
}

非常基本而且很蠻力,但是它應該可以使您正確地完成作業。

您需要使用算法對數據進行平滑處理,使其具有代表性,並在平滑數據指示的位置查找實際峰值(因為它不准確)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM