2016-03-29 191 views
1

我繪製正弦波(左列)以及它們各自的頻域表示(右欄):傅立葉變換

  • 第一波(振幅:10;頻率:0.5)第二波(振幅:15;頻率:5.0)看起來絕對如預期。
  • 第三波只是第一和第二波形總結和繼承的問題

第二頻率圖具有在x = 5(頻率)正好一個峯,Y = 15(振幅)。

當只有一個頻率時,爲什麼第一個頻率圖有多個峯?

enter image description here

import numpy as np 
import matplotlib.pyplot as plt 

def sine(freq, time_interval, rate, amp=1): 
    w = 2. * np.pi * freq 
    t = np.linspace(0, time_interval, time_interval*rate) 
    y = amp*np.sin(w * t) 
    return y 

def buildData(): 
    secs = 3 
    Fs = 44100 
    # frequency, duration, sampling rate, amplitude 
    y1 = sine(0.5, secs, Fs, 10) 
    y2 = sine(5, secs, Fs, 15) 
    y3 = y1 + y2 
    signals = [y1, y2, y3] 
    showSignals(signals, Fs, secs) 

def showSignals(signals, fs, secs): 
     nrSigs = len(signals) 
     fig = plt.figure() 
     fig.subplots_adjust(hspace=.5) 
     for i in range(len(signals)): 
      cols=2 
      pltIdc = [] 
      for col in range(1,cols+1): 
       pltIdc.append(i*cols+col) 
      s = signals[i] 
      t = np.arange(0, secs, 1.0/fs) 
      ax1 = plt.subplot(nrSigs, cols, pltIdc[0]) 
      ax1.set_title('signal') 
      ax1.set_xlabel('time') 
      ax1.set_ylabel('amplitude') 
      ax1.plot(t, s) 

      amps = 2*abs(np.fft.fft(s))/len(s) # scaled power spectrum 
      amps = amps[0:len(amps)/2] # because of the symmetry 
      amps = amps[0:50] # only the first 50 frequencies, arbitrarily chosen 
      # this should be close to the amplitude: 
      print 'magnitude of amplitudes: ' + str(sum(amps*amps)**0.5) 
      freqs=np.arange(0, len(amps), 1)/secs 
      ax2 = plt.subplot(nrSigs, cols, pltIdc[1]) 
      ax2.grid(True) 
      ax2.set_title(r"$\frac{2 \cdot fft(s)}{len(s)}$") 
      ax2.set_xlabel('freq') 
      ax2.set_ylabel('amplitude') 
      ax2.stem(freqs, amps) 
     plt.show() 

buildData() 

回答

0

的FFT例程執行一個(快速實現)的離散傅里葉變換,其分解的時間序列信號到由所述傅立葉「單位根」的N長度正交基。

當且僅當您輸入傅里葉基函數(或其相位旋轉版本)之一的信號時,您將得到一個離散的單個FFT輸出值,因爲它將具有非零的內部產品有一個且僅有一個成員(根據定義)。

你的第一個例子在分析窗口內有1.5個循環,所以它不能是一個統一的根(傅里葉基函數的一個屬性是它們在分析窗口內有整數循環計數)。因此,存在非零的「直流偏移」(分析窗口上的平均值不完全爲零),這將始終產生「直流」項(索引0處的非零傅立葉貢獻對應於直流偏移)。因爲它是分析窗口內的非積分循環計數,除了來自最接近正弦波的頻率的主要貢獻之外,還可以從FFT以外的其他頻率獲得貢獻。這與預期的一樣 - 任何本身不是傅里葉基函數的正弦曲線將具有非零內積且具有多個傅里葉基函數(並因此在FFT輸出中具有多個譜貢獻)。

你的第三個例子只是另外兩個的總和,所以通過傅里葉變換的線性,FFT的輸出就是兩個單獨信號的FFT的和。這也是預期的:FFT(a + b)= FFT(a)+ FFT(b)。

0

如果頻率恰好在FFT長度內的整數個週期內,則DFT或FFT將僅從正弦曲線產生單點結果(圖中的尖峯)。否則,能量將在所有其他FFT結果箱中分散(但主要在附近的結果頻率箱中)。這不是「搞砸」,而是有限長度DFT的正常預期行爲。

+0

謝謝。處理非整數週期的常用窗口方法是什麼?特別是在處理真實世界的數據時。海明/漢寧? – bogus

+0

@bogus:這是一個很好的問題;而是一個單獨的問題,因此應該在這裏或在dsp.stackexchange中作爲單獨的問題來詢問,而不是作爲評論 – hotpaw2