2016-03-29 13 views
1

ich Plotte Sinuswellen (linke Spalte) und ihre jeweiligen Frequenzbereichsdarstellungen (rechte Spalte):Fourier Transform von Sinuswellen mit unerwarteten Ergebnissen

  • Die erste Welle (Amplitude: 10; Frequenz: 0,5) hat eine etwas vermasselte fft-Darstellung
  • Die zweite Welle (Amplitude: 15; Frequenz: 5,0) sieht absolut wie erwartet aus.
  • Die dritte Welle ist nur die erste und die zweite Welle aufsummiert und erbt die Probleme

Die zweite Frequenzdarstellung hat genau einen Peak bei x = 5 (Frequenz), y = 15 (Amplitude).

Warum hat das erste Frequenzdiagramm mehrere Spitzen, wenn nur eine Frequenz vorhanden ist?

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() 

Antwort

0

Die Routine führt eine FFT (schnelle Implementierung) diskrete Fourier-Transformation, die eine Zeitreihensignal in eine N-Länge Orthonormalbasis zersetzt, bestehend aus dem Fourier „Einheitswurzeln“.

Sie erhalten einen diskreten Einzelwert des FFT-Ausgangs genau dann, wenn Sie ein Signal eingeben, das eine der Fourier-Basisfunktionen ist (oder eine phasenrotierte Version davon), da es einen inneren Nullwert hat Produkt mit einem und nur einem Mitglied des Basissatzes (per Definition).

Ihr erstes Beispiel hat 1,5 Zyklen innerhalb des Analysefensters, daher kann es keine Einheitswurzel sein (eine Eigenschaft der Fourier-Basisfunktionen besteht darin, dass sie innerhalb des Analysefensters ganzzahlige Zykluszählungen aufweisen). Folglich gibt es einen von Null verschiedenen "DC-Offset" (der Durchschnitt über das Analysefenster ist nicht genau Null), was immer einen "DC" -Term ergibt (Nicht-Null-Fourierbeitrag am Index 0 entsprechend einem DC-Offset). Da es sich um eine nicht-integrale Zykluszahl innerhalb des Analysefensters handelt, erhalten Sie zusätzlich zu dem dominanten Beitrag von der Frequenz, die Ihrer Sinuskurve am nächsten ist, Beiträge von anderen Frequenzen außerhalb der FFT. Dies ist wie erwartet - jede Sinuskurve, die selbst keine Fourier-Basisfunktion ist, wird ein von Null verschiedenes inneres Produkt mit mehreren Fourier-Basisfunktionen (und somit mehrere spektrale Beiträge in der FFT-Ausgabe) aufweisen.

Ihr drittes Beispiel ist nur die Summe der beiden anderen, also ist die Ausgabe der FFT durch die Linearität der Fouriertransformation einfach die Summe der FFTs der beiden Einzelsignale. Dies wird ebenfalls erwartet: FFT (a + b) = FFT (a) + FFT (b).

0

Eine DFT oder FFT erzeugt nur dann ein Einzelpunktergebnis (Spitze im Diagramm) von einer Sinuskurve, wenn die Frequenz in genau einer ganzzahligen Anzahl von Perioden innerhalb der FFT-Länge periodisch ist. Andernfalls wird die Energie unter allen anderen FFT-Ergebnisbins verteilt (aber meistens in benachbarten Ergebnisfrequenzbins). Dies ist kein "Durcheinander", sondern normales erwartetes Verhalten für DFTs mit endlicher Länge.

+0

Danke. Was sind gängige Fenstermethoden zur Verarbeitung nicht ganzzahliger Zyklen? Besonders wenn es um reale Daten geht. Hamming/Hanning? – bogus

+0

@bogus: Das ist eine gute Frage; aber eine separate Frage, die daher als separate Frage hier oder im dsp.stackexchange gestellt werden sollte, und nicht als Kommentar – hotpaw2