【发布时间】:2018-09-04 21:25:06
【问题描述】:
我使用以下sox 命令生成音频文件SingleTone.wav。
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 的误解、代码中的错误或设置的任何不正确之处。
【问题讨论】:
-
N = 8192你真的有这么多样本吗?您似乎根据硬编码数字而不是文件中的信息来设计频率轴。请改用len(data)和fs! -
sox 默认不生成 48 kHz 的采样率吗?尝试将
rate 44100添加到您的 sox 命令中 -
@mtrw,是的,它看起来大部分修复了它!
-
由于我不知道的原因,除了 525 的一个尖峰之外,我似乎还在 0 Hz 处出现尖峰。
-
0 Hz 处的峰值是直流分量。数据很可能具有 DC 分量,因此所有样本值都是正数,并存储为无符号整数。您听不到直流分量,因此无关紧要。
标签: python audio signal-processing fft sox