【问题标题】:FFT window output about 10% off PythonFFT 窗口输出约 10% 关闭 Python
【发布时间】:2015-01-27 03:28:20
【问题描述】:

我正在编写代码,该代码采用每个正弦波的 1024 个采样窗口,对每个窗口进行 FFT,并返回每个窗口的最大频率。我知道它们对于正弦波都是一样的,但它是用于测试的。我的代码大部分工作,除了结果频率似乎比应有的低 10% 左右。例如,在我的 FFT 中,440Hz 的正弦会导致频率为 430 的最大幅度。我一生都无法弄清楚是什么原因造成的。有什么建议吗?

import math
import numpy as np
import matplotlib.pyplot as plt
import pylab as py
from scipy import fftpack
from pylab import *
import scipy.io.wavfile

def PARTA(window):

    sr = 44100
    x = arange(0., 2*pi, 1./sr)
    samples = sin(2*pi*440*x)

    time_step = 1. / sr

    end = len(samples)/window
    print end
    '''Make a 2-D array of samples'''
    windowed = []
    maxes = []
    for i in range(0, end):
        windowed.append(samples[i*window:(i+1)*window])
    for j in range(0, end):
        ps = np.abs(np.fft.fft(windowed[j]))**2
        freqs = np.fft.fftfreq(windowed[j].size, time_step)
        max_y = max(ps)  # Find the maximum y value
        max_x = freqs[ps.argmax()]  # Find the x value corresponding to the    maximum y value
        maxes.append(max_x)
    end2 = float(len(samples)/sr)
    #print end2
    interval = end2/end
    #print interval
    x = arange(0., end2, interval)
    y = []
    for i in range(0, len(maxes)):
        y.append(abs(maxes[i]))
    return (x, y)

x, y = PARTA(1024)
plt.plot(x, y, 'ro')
plt.show()

【问题讨论】:

    标签: python fft


    【解决方案1】:

    只是您的 FFT 分辨率非常粗糙,因为它只有 1024 个 bin。 FFT 中的每个 bin 的分辨率为 44100 / 1024 = 43.1 Hz。您的 440 Hz 峰值将位于 bin 索引 10 处,其对应的中心频率为 10 * 44100 / 1024 = 430.66 Hz

    有关 FFT bin 索引和相应频率的更多详细信息,请参阅 this question

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-03-11
      • 1970-01-01
      • 2020-06-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-31
      • 1970-01-01
      相关资源
      最近更新 更多