为什么以下FFT会产生与用于生成的频率不同的频率集?

问题描述 投票:0回答:1

我使用以下SingleTone.wav命令生成音频文件sox

sox -n SingleTone.wav synth 10 sin 525

然后,我执行以下程序,对此音调的样本执行fft。

import matplotlib.pyplot as plt
from scipy.fftpack import fft, rfft
from scipy.io import wavfile
from sys import argv

# FFT sample count
N = 8192

# Sampling frequency
samples_per_second = 44100

# Frequency resolution
freq_resolution = samples_per_second / N

fs, data = wavfile.read(argv[1])
a = data.T
b=[(ele/2**8.)*2-1 for ele in a]
c = fft(b, N)
d = len(c)/2 - 1 
frequencies = [x*freq_resolution for x in xrange(d)]
print '\n'.join(",".join([str(f),str(x)]) for f, x in zip(frequencies, abs(c[:d])))
plt.plot(frequencies, abs(c[:d]),'r')
plt.show()

我得到的输出是440 Hz和455 Hz之间的频率尖峰,而不是像我预期的那样在525 Hz

差距是什么原因造成的?

有效的答案将指向对FFT的误解,代码中的错误或任何有关设置的错误。

python audio signal-processing fft sox
1个回答
1
投票

试试这个:使用wav文件中的采样率,为了方便和减少错误,请使用fft库提供的频率列表。

以下是上述代码,

#!/usr/bin/python

import matplotlib.pyplot as plt
from scipy.fftpack import fft, rfft, fftfreq, rfftfreq
from scipy.io import wavfile
from sys import argv

samples_per_second, data = wavfile.read(argv[1])

# FFT sample count
N = 8192

a = data.T
b=[(ele/2**8.)*2-1 for ele in a]

c = fft(b, N)
d = len(c)/2 - 1 

frequencies = fftfreq(N,1./samples_per_second)

#print '\n'.join(",".join([str(f),str(x)]) for f, x in zip(frequencies[:d], abs(c[:d])))

plt.plot(frequencies[:d], abs(c[:d]),'r')
plt.show()
© www.soinside.com 2019 - 2024. All rights reserved.