簡體   English   中英

FFT窗口輸出關閉Python約10%

[英]FFT window output about 10% off Python

我正在編寫的代碼將每個正弦波的窗口采樣為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()

只是您的FFT具有非常粗糙的分辨率,因為它只有1024個bin。 FFT中的每個bin的分辨率為44100 / 1024 = 43.1 Hz 您的440 Hz峰值將在bin索引10處,其相應的中心頻率為10 * 44100 / 1024 = 430.66 Hz

有關FFT bin索引和相應頻率的更多詳細信息,請參見此問題

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM