我获得了一个1000Hz的音频文件(正弦波)作为FFT算法的输入。
我在一个阵列中获得了8192个功率谱样本。检查我的输出是对还是错?

如果我给出一个无声音频文件,则所有样本的输出均为零。
在正弦波形中,o / p从20(第0个样本)到26059811(第743个样本),并逐渐减小到40。

如果我对输出范围有所了解,那么我可以从技术上证明FFT是否有效。

任何想法都会有所帮助。

如有任何技术疑问,请参考此链接。

评论

你可以绘制数组吗? (也许是在电子表格软件中?)

数组中有8192个值。您要我手动进行绘制,否则电子表格将对其进行处理。我正在研究MAC

我已经在MS Excel中绘制了数以万计的示例;数字或其他数字也适用。还是gnuplot。

别忘了开放办公室

@假名:我无法绘制图形。.

#1 楼

看来您正在通过平均10个窗口(不重叠?)以在8192或8193频率(从0到Nyquist,但某些算法可能会在bin 8192处丢弃Nyquist频率)上求平方的平均值来计算频谱。 >
首先要检查的是峰在正确的仓中。您没有说采样率是多少,但是bin 743是采样率的743/16384倍。如果信号确实为800 Hz,则Fs约为17640个样本/秒。好像错了您的测试信号可能采用标准速率,例如8000、16000、22050、32000、44100或48000。对于Fs = 22050,峰值将在bin 800/22050 * 16384 = 594中急剧变化。

另一个要检查的标准是,信号的总能量在时域和频域都大致相同。这是Python中的一个示例: NFFT的大小= 2048个样本。调用psd(功率谱密度)可将频谱y计算为十个16384点DFT(实际上是8193点,因为x是实值)的大小平方的平均值。

计算得到的频域能量具有N / 16384的比例因子,因为psd函数将y比例缩放为DFT大小而不是总信号长度。这是否是一个问题取决于系统如何处理PSD标准化。另一个可选的归一化是按1 / Fs缩放。这使能量与原始模拟信号匹配。默认规范化应该在库中有详细记录。

评论


$ \ begingroup $
我测试了1000 Hz的正弦波信号。我的FFT给出了正确的答案,谢谢您的帮助。
$ \ endgroup $
–战士
2010-10-29 6:40

#2 楼

您需要绘制FFT输出的幅度。我不熟悉您的编程语言,但是在Python中,您将使用plot(abs(fft(a)))之类的东西。对于静默输入,输出应全为零。对于正弦波输入,应该看到两个尖峰:



对于真实信号,尖峰将从左到右对称。但是,如果您要进行真实的FFT(计算效率更高),则只会得到图的左半部分作为输出,因为它会忽略冗余镜像。

频率越高,尖峰将越靠近中心。如果频率与块大小完全同步,则尖峰将只有一个点宽,而其他所有峰都将恰好为0。否则,它将像上面一样具有逐渐变细的“裙”。

评论


$ \ begingroup $
您是说功率谱值就是振幅吗?
$ \ endgroup $
–战士
2010-10-28 14:02

$ \ begingroup $
t->参考时间?
$ \ endgroup $
–战士
10-10-28在14:03

$ \ begingroup $
不用担心时间。如果您只是在检查FFT是否正常工作,您要做的就是检查幅度的形状是否与此相似。
$ \ endgroup $
– Endolith
2010-10-28 14:06

$ \ begingroup $
反正我的FFT无法正常工作。我肯定会在空闲时间尝试实现图表。非常感谢。
$ \ endgroup $
–战士
2010-10-29 6:41

$ \ begingroup $
@clabacchio:哦。 FFT在图的开始和结束处产生一个f = 0轴的输出。曲线的中点是f = fs / 2轴。通常会有一个fftfreq或fftshift函数来重新安排绘图,以使0频率位于中心。 flic.kr/p/arVeZT
$ \ endgroup $
– Endolith
2012年2月9日在16:12

#3 楼

我已经使用Excel Analysis Toolpak中的傅立叶分析工具对数据和结果进行了快速检查。

评论


$ \ begingroup $
我正在研究MAC。
$ \ endgroup $
–战士
10-10-28在13:32

$ \ begingroup $
@Warrior-然后使用MacPorts或Fink安装Gnumeric(如果需要,也可以在此页面上查看鸭嘴兽包装的一些信息)
$ \ endgroup $
–凯文·维米尔(Kevin Vermeer)
10-10-28在16:28