FFT不提供谐波而不是基频的整数倍

时间:2016-03-16 06:30:45

标签: audio fft

FFT不提供谐波而不是基频的整数倍。

这是FFT的结果(基频为441.4307 Hz(指数:328)) 其中index是FFT图的x的位置

enter image description here

2 harmonic freq = 884.2072(index:657)
3 harmonic freq = 1328.3295(index:987)
4 harmonic freq = 1775.1434(index:1319)
5 harmonic freq = 2221.9574(index:1651)
6 harmonic freq = 2675.5005(index:1988)
7 harmonic freq = 3135.7727(index:2330)
8 harmonic freq = 3592.0074(index:2669)
9 harmonic freq = 4064.3921(index:3020)
10 harmonic freq = 4531.3934(index:3367)
11 harmonic freq = 5011.8530(index:3724)
12 harmonic freq = 5480.2002(index:4072)
13 harmonic freq = 5943.1641(index:4416)
14 harmonic freq = 6420.9320(index:4771)
15 harmonic freq = 6887.9333(index:5118)
16 harmonic freq = 7346.8597(index:5459)
17 harmonic freq = 7805.7861(index:5800)
18 harmonic freq = 8264.7125(index:6141)
19 harmonic freq = 8723.6389(index:6482)
20 harmonic freq = 9167.7612(index:6812)
如你所见,它不是基本频率的完全整数倍。

它的错误越来越大。

当我混合两个声音(音符)时,我找不到一个声音的谐波。

如何更准确地找到谐波?

修改

图表来自此代码

实际上我做了stft,每个帧大小是2 ^ 15(32768)

s = np.fft.rfft(frames)

所以有几个帧(0,1,2,...,n) 我从这段代码获得了频率

timebins, freqbins = np.shape(s)
allfreqs = np.abs(np.fft.fftfreq(2^15, 1./44100)[:freqbins+1])

从这段代码我得到allgreqs [0] = 1.3

上图是s(s [i])

之一

我想知道为什么这些垃圾箱不是整数倍

首先选择的bin(红色)是441 Hz,其中x = 328 并且第20个选定的箱(最后的黄色)是9167Hz,其中x = 6812

我发现有几个网络说每个谐波都是基频的整数倍(一次谐波=基频,二次谐波=(基频* 2)等等......)

我预计第20个选定的bin为8820 Hz,x = 6560为基频的20倍。

计算更多谐波频率时误差越来越大。

为什么会这样?我该如何解决这个问题。

0 个答案:

没有答案