FFT在频谱中显示(奇怪的)正弦波
我不太确定这算是编程问题还是数学问题,不过我整理了一些关于快速傅里叶变换(FFT)的简单例子。我加载了一个440赫兹的波形,并在上面叠加了一些正弦波,但不知道为什么,频谱中出现了一个我不理解的“波”。
根据我的理解,频谱应该对所有频率都有相同的|Y(freq)|值。
from pylab import plot, show, xlabel, ylabel, subplot
from scipy import fft, arange
from numpy import linspace, array
# from scipy.io.wavfile import read,write
import scikits.audiolab as audio
import math
def plotSpectru(y,Fs):
n = len(y) # lungime semnal
k = arange(n)
T = n/Fs
frq = k/T # two sides frequency range
frq = frq[range(n/2)] # one side frequency range
Y = fft(y)/n # fft computing and normalization
Y = Y[range(n/2)]
plot(frq,abs(Y),'r') # plotting the spectrum
xlabel('Freq (Hz)')
ylabel('|Y(freq)|')
Fs = 44100; # sampling rate
# (data, rate, bits) = audio.wavread('440Hz_44100Hz_16bit_05sec.wav')
(data, rate, bits) = audio.wavread('250Hz_44100Hz_16bit_05sec.wav')
for n in xrange(0,4*120, 4):
n=n/40.
data = array([x+math.sin(n*idx) for idx,x in enumerate(data)])
y=data[:]
lungime=len(y)
timp=len(y)/44100.
t=linspace(0,timp,len(y))
subplot(2,1,1)
plot(t,y, color="green")
xlabel('Time')
ylabel('Amplitude')
subplot(2,1,2)
plotSpectru(y,Fs)
show()
1 个回答
0
我不太明白你想怎么计算正弦波?这里有一个小例子,教你怎么用numpy添加一个正弦波。
duration = len(data)/float(rate)
t = np.linspace(0, len(data), rate*duration)
sinewave = np.sin(2*np.pi*440*t)
data += sinewave
编辑
抱歉,我重新读了你的问题,发现我的回答并没有解决你的疑问。即使你真的把所有正频率(通过fft分析得到的)都加上,你也不会得到一个均匀的|Y(freq)|。
duration = len(data)/float(rate)
t = np.linspace(0, len(data), rate*duration)
allfreqs = np.fft.fftfreq(len(data), 1.0/rate)
for f in allfreqs[:len(allfreqs)/2]:
data += np.sin(2*np.pi*f*t)
根据我的理解,这主要是因为干扰。如果你添加了很多正弦波,有些波可能会变得更弱,有些则会变得更强。
如果你给每个波分配一个随机的相位,情况就会有所不同:
duration = len(data)/float(rate)
t = np.linspace(0, len(data), rate*duration)
allfreqs = np.fft.fftfreq(len(data), 1.0/rate)
for f in allfreqs[:len(allfreqs)/2]:
data += np.sin(2*np.pi*f*t + np.random.rand()*np.pi)