2015-01-25 2 views
0

나는 FFT를 사용하고 그것을 음모하려고 노력 중이다. 문제는 내 코드가 작은 주파수 (예 : 50)에서는 작동하지만 필요한 더 큰 주파수에서는 작동하지 않는다는 것입니다. 내 코드는 어떻게됩니까? 나는 사인파 입력의 주파수에서 스파이크를 볼 것으로 예상하지만 스파이크는 내가 사용하는 샘플 간격에 따라 다른 주파수에 있습니다.이상한 FFT 출력 파이썬

bins = 600 
ss = 2048 
freq = 44100 
centerfreq = freq*bins/ss 
# Number of samplepoints 
N = ss 
# sample spacing 
T = 1/800. 
x = np.linspace(0.0, N*T, N) 
y = sin(2*np.pi*centerfreq*x) 
yf = fft(y) 
xf = np.linspace(0.0, 1.0/(2.0*T), N/2) 
plt.plot(xf, 2.0/N * np.abs(yf[0:N/2]), 'r') 
+1

"작동하지 않는다"는 것은 무엇을 의미합니까? 입력 내용은 무엇입니까, 당신은 무엇을 기대 했습니까? 실제로 무슨 일이 일어 났습니까? –

+0

입력 내용은 게시 된 코드 (bins, ss, freq)에 나와 있습니다. 출력은 그래프에서 위의 코드에서 "centerfreq"와 관련이없는 주파수로 스파이크가됩니다. "T"의 값을 바꿀 때 스파이크가 움직이는 것처럼 보입니다. –

답변

2

코드는 바로, 당신은 당신의 푸리에 이론과 나이 퀴 스트 샘플링 정리를 브러시와 숫자가 의미가 있는지 확인해야합니다. 문제는 x 축 규모입니다. 플롯 함수는 x의 첫 번째 항목을 y에 첫 번째 항목으로 표시합니다. x가 예상대로 조정되지 않으면 놀랍습니다. 또한 정현파 신호 (사인파)를 플롯하고 '도'를 예상하고 인스턴스가 라디안 인 경우 이것을 볼 수 있습니다. 귀하의 기대에 부합하도록 귀하의 의무를 잘 확장하십시오.

이 대답은 https://stackoverflow.com/a/25735436/2061422입니다.

from scipy import * 
from numpy import * 
from pylab import * # imports for me to get going 

bins = 600 
ss = 2048 
freq = 44100 
centerfreq = freq*bins/ss 
print centerfreq 
# Number of samplepoints 
N = ss 
# sample spacing 
T = 1./freq # i have decreased the spacing considerably 
x = np.linspace(0.0, N*T, N) 
sample_spacing = x[1] - x[0] # but this is the real sample spacing 
y = sin(2*np.pi*centerfreq*x) 
yf = fft(y) 
xf = np.linspace(0.0, 1.0/(2.0*T), N/2) 
freqs = np.fft.fftfreq(len(y), sample_spacing) # read the manual on this fella. 
plt.plot(freqs[:N/2], 1.0/N * np.abs(yf[0:N/2]), 'r') 
plt.grid() 
plt.show()