Я пишу код, который принимает окна 1024 выборок каждый из синусоидальных волн, принимает БПФ каждого окна и возвращает максимальную частоту каждого окна. Я знаю, что все они будут одинаковыми для синусоиды, но это для тестирования. Мой код работает в основном, за исключением того, что результирующие частоты кажутся примерно на 10 процентов ниже, чем они должны быть. Например, синус 440 Гц приводит к максимальной амплитуде на частоте 430 в моем БПФ. Я не могу для жизни меня понять, что вызывает это. Какие-либо предложения?Выход окна FFT около 10% от Python
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()