【问题标题】:FFT in Python with ExplanationsPython 中的 FFT 说明
【发布时间】:2015-10-10 04:59:18
【问题描述】:

我有一个想要在频域中可视化的 WAV 文件。接下来,我想写一个简单的脚本,接收一个WAV文件,输出某个频率“F”的能量是否超过阈值“Z”(某个音调在WAV文件中是否有很强的存在感)。网上有一堆代码sn-ps,展示了如何在Python中绘制FFT谱,但是很多步骤我都不懂。

  1. 我知道 wavfile.read(myfile) 返回采样率 (fs) 和数据数组 (data),但是当我对其运行 FFT (y = numpy.fft.fft(data)) 时,什么单位你在吗?
  2. 为了获得 x 轴的频率数组,一些海报在 n = len(data) 处这样做:

    X = numpy.linspace(0.0, 1.0/(2.0*T), n/2)

    和其他人这样做:

    X = numpy.fft.fftfreq(n) * fs)[范围(n/2)]

    这两种方法有区别吗?有没有很好的在线解释这些操作在概念上的作用?

  3. 一些关于 FFT 的在线教程提到了开窗,但没有很多发帖人在他们的代码 sn-ps 中使用开窗。我看到 numpy 有一个 numpy.hamming(N),但是我应该使用什么作为该方法的输入以及如何将输出窗口“应用”到我的 FFT 数组?
  4. 对于我的阈值计算,找到 X 中最接近我所需音调/频率的频率并检查 Y 中相应元素(相同索引)的幅度是否大于阈值是否正确?

【问题讨论】:

    标签: python audio signal-processing fft


    【解决方案1】:
    1. FFT 数据以归一化频率为单位,其中第一个点为 0 Hz,最后一个点fs Hz。您可以使用linspace(0.0, (1.0 - 1.0/n)*fs, n) 自己创建频率轴。你也可以使用fftfreq,但是分量会是负数。

    2. 如果n 是偶数,则它们是相同的。我想你也可以使用rfftfreq。请注意,这只是您频率的“正半部分”,这可能是您想要的音频(实值)。请注意,您可以使用rfft 只产生频谱的正半部分,然后使用rfftfreq(n,1.0/fs) 获得频率。

    3. 加窗会降低旁瓣电平,但代价是加宽任何频率的主瓣。 N 是信号的长度,您将信号乘以窗口。但是,如果您正在查看一个长信号,您可能希望将其“切碎”成碎片,将它们加窗,然后添加其光谱的绝对值。

    4. “是否正确”很难回答。简单的方法就是如您所说,找到最接近您的频率的 bin 并检查其幅度。

    【讨论】:

    • 所有 FFT 都根据定义进行窗口化。如果不显式应用窗口函数,则结果是方形窗口。
    • 这是正确的,但它以最迂腐的方式是正确的——一个全信号宽度的矩形窗口只是一个全为一的信号。
    猜你喜欢
    • 2012-06-01
    • 2015-12-02
    • 2015-10-31
    • 2013-03-24
    • 1970-01-01
    • 1970-01-01
    • 2022-08-22
    • 1970-01-01
    • 2021-08-13
    相关资源
    最近更新 更多