【问题标题】:Confusion about scipy.fft function关于 scipy.fft 函数的困惑
【发布时间】:2015-04-08 05:32:31
【问题描述】:

我有一个音频样本,它以 22k Hz 和总样本 = 660k 进行采样,因为持续时间为 30 秒。 (22k*30 = 660k)

当我绘制完整样本的 fft 时,我得到一个具有 660k x 值和对应 y 值的对称图,如图所示:

这似乎读作声音样本的最大频率为 330k Hz,(我认为它在 fft 变换的一半后重复,因为负频率和正频率具有相同的值)。如果我调整声音样本的长度,fft图的最大频率会相应改变 (长度/2 -> 最大频率/2), 这不应该发生,因为频率与样本长度无关。

有什么建议吗?我无法理解这一点。

【问题讨论】:

    标签: python audio scipy fft


    【解决方案1】:

    当您以 fs 的采样率计算长度为 N 的音频(或任何数据)的 FFT 时,结果将是一个数组,Y em>,N 个复数,其中

    magnitude(Y(n)) = 频率 (n * fs)/N Hz 处的幅度。

    其中 n = 0,1,2,...N。

    表示 Y 包含从 0 到 fs 的频率信息(在 matlab 等一些软件中,返回的范围是从 -fs/2 到 fs/2)。

    在你的情况下 fs = 22000Hz , N = 660000 所以

    magnitude(Y(n)) = 频率 (n * 22000)/660000 Hz 处的幅度; n = 0,1,2,...660000。

    所以你的 x 轴应该从 0Hz 运行到 22000Hz,而不是从 0 到 660000。

    【讨论】:

    • 对,这就是我的想法,改变样本大小不应该改变 fft,因为它采样到特定的频率限制(采样率)。我将在 MATLAB 中运行类似的代码,然后在此处发表评论。
    • 改变样本数量并没有改变太多的频谱(正如预期的那样)问题是你没有正确绘制,你绘制的是幅度与样本索引而不是幅度与频率。样本根本不应该影响 x 轴的范围。
    • 你不需要去 matlab,我给你一个返回不同范围的软件的例子,我不应该包括那行,因为它似乎引起了一些混乱.
    • 您可以使用np.fft.fftfreq 根据样本数量和采样间隔创建频率数组。将其用于两种情况的 X 轴应该会给出几乎相同的结果(如果您忽略 X 轴值)。
    • @KillaKem 是的,我现在明白了。 fft 是由函数计算的样本数。看到一个 Matlab 代码证明了这一点。谢谢
    猜你喜欢
    • 2018-04-26
    • 2020-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-30
    • 2011-11-21
    相关资源
    最近更新 更多