2012-05-04 48 views
0

我目前正在为我的第二年开展一个项目。我应该用java编码一个调谐器。我选择了做吉他调音器。查找光谱图的峰值

在互联网上浏览后,我发现了一个Java代码来做FFT。我改变了一下,理解它并进行了测试。我知道它工作正常(我做了一个图形,并使用简单的正弦函数来查看不同的峰值)。

我现在试图找到基本频率。据我所知,这个频率是由第一个高峰给出的。

因此,我想创建一个方法,例如找到我的FFT的前5个峰值,并将其与他们的索引给我。

我首先做了一个简单的方法,在这里我比较了每个点的两个和两个光谱图,当符号发生变化时,我知道这里有一个峰值。这种方法在理想信号下工作良好(没有任何噪音)。然而,如果我增加噪音,它就变得毫无用处。我真的很糟糕的Java(我实际上开始这个项目,基本上我上面描述的简单功能是我的主要作品....只是让你了解我的水平)。

任何人都可以帮助我吗?我真的很感激! :) 在此先感谢!

祝您有美好的一天!

fireangel

+0

音高不是FFT峰值频率。音调频率可能不是第一个峰值或任何峰值。特别是对于从吉他的低弦录制的声音。 – hotpaw2

+0

可能的重复:http://stackoverflow.com/questions/8699360/audio-analysis-frequency-vs-pitch – hotpaw2

+0

谢谢你hotpaw2为你回答。我也提出了球场的概念。根据我的理解,音高与频率有关,所以我认为找到频率可以让我知道音调。 – fireangel3000

回答

0

我说你最好的选择将是在所有的值作为一个数组来读取,然后在他们运行和“平滑”他们使用某种类型的滚动平均值。

之后,你会有一个更平滑的曲线。使用此曲线查找峰值,然后返回到原始数据并使用峰值指标查找那里的实际峰值。

伪代码:

// 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]]; 
} 

非常基本的和非常暴力,但它应该让你在正确的轨道进行分配的。

您需要使用平滑数据的算法,以便它具有代表性,并且可以在平滑数据指示的位置查找实际峰值(因为它不会精确)。

+0

Hello Charles.Thanks很多答案。如果我理解正确,你所做的平滑是通过取我原始数据的5个值的平均值。就像这样,所有来自噪音的小峰将因为一个真正的高峰而消失。那是对的吗? 但是,我不明白的是,如果我查找第一个峰后,我将得到与我的实际峰值指数不相符的峰的指数。我没有看到如何找回真正的... – fireangel3000

+0

基本上,你所做的只是平均出小尖峰,这意味着平滑线将代表一个总体趋势:平坦,向上,向下,峰值,等等问题可能在于,如果原始数据中“真实”高峰两侧存在严重的向下或向上尖峰,那么可能会使平均值偏斜,从而在任一方向人为地移动峰值。您必须使用算法来减少这些噪声峰值的影响。 – Charles

+0

谢谢你的答案查尔斯。 我实际上采用了一种使用Harmonic Product Spectrum的全新方法,现在它工作正常。非常感谢你的帮助! – fireangel3000