Diskrete Fourier-Transformation

© C. Roppel, Fachhochschule Schmalkalden, Fachbereich Elektrotechnik

Beschreibung

Ein zeitdiskretes Signal besteht aus der additiven Überlagerung zweier Sinusschwingungen und einer Rauschkomponente. Die erste Sinuskomponente hat die Frequenz 770 Hz und die Amplitude 1. Frequenz und Amplitude der zweiten Sinuskomponente sind variabel, ebenso wie die Rauschamplitude. Die Abtastrate beträgt 8 kHz. 

Das obere Bild zeigt die ersten 100 Abtastwerte. Dies entspricht einem Zeitinterval von 12,5 ms. Das untere Bild zeigt das Spektrum des Signals, das mit Hilfe der diskreten Fourier-Transformation (DFT) berechnet wird. Die DFT ist so skaliert, dass eine Sinusschwingung der Amplitude 1 in einer spektralen Linie der Höhe 1 bzw. 0 dBV resultiert. Bei der DFT kann die Anzahl der Abtastwerte, N, sowie die Bewertung des Signals mit einer Fensterfunktion festgelegt werden. So kann beispielsweise der Einfluss der DFT-Parameter auf die spektrale Auflösung und die Amplitudengenauigkeit untersucht werden.

Vgl. auch Kapitel 8.1.3 in [Roppel, C.: Grundlagen der digitalen Kommunikationstechnik, Hanser Verlag, 2006].

sine1 = Table[Sin[2 π 770 x], {x, 0, 4095/8000, 1/8000}];
SeedRandom[1234];
noise = RandomReal[{-0.5,0.5},4096];
wHanning[i_, nn_] := (1 - Cos[2 π i/nn])/2
wBlackman[i_, nn_] := 0.42 -0.5 Cos[2 π i/nn] + 0.08 Cos[4 π i/nn]

Manipulate[
sine2 = Table[Sin[2 π f2 x], {x, 0, (nbr-1)/8000, 1/8000}];
wnHan = Table[wHanning[i, (nbr-1)], {i, 0,  nbr-1}]; (* Hanning window *)
wnBl = Table[wBlackman[i, (nbr-1)], {i, 0,  nbr-1}]; (* Blackman window *)
signal = Take[sine1, nbr] + amp2 sine2 + noiseAmp Take[noise, nbr];
If[window == 1, signalw = signal,If[window == 2, signalw = wnHan signal, signalw = wnBl signal]];

spectrum= (2/nbr)Take[Abs[Fourier[signalw,FourierParameters->{1,-1}]], nbr/2];

t = Table[t, {t, 0, 99/8000, 1/8000}];
f = Table[f, {f, 0, 8000 (nbr-1)/(2 nbr), 8000/nbr}];

GraphicsColumn[{ListPlot[Transpose[{t, Take[signal, 100]}], PlotRange->All,Joined->True, PlotStyle->{{RGBColor[0,0,1]}},  Frame->True,FrameLabel->{{None, None}, {"t [s]","Signal"}}, FrameTicks->{Automatic, None}, AspectRatio->0.35, ImageSize->{500,250}],
ListPlot[Transpose[{f, If[scale == 1, spectrum, 20 Log[10, spectrum]]}], PlotRange->If[scale == 1, {-0.1, 1}, {-70, 0}], Joined->True,
 Frame->True, Axes->True, PlotRange->All, FrameLabel->{{None, None}, {"f [Hz]", "DFT"}}, FrameTicks->{Automatic, Automatic}, AspectRatio->0.35, PlotRangeClipping->True, ImageSize->{500,250}]}],
Style["Frequenz",Bold],
{{f2, 1200, "f [Hz]"}, 100, 3900, 10,Appearance->"Labeled",ImageSize->Small},
Style["Signalamplitude",Bold],
{{amp2, 0.1, "a"}, 0.01, 1, 0.01,Appearance->"Labeled",ImageSize->Small},
Delimiter,
Style["Rauschamplitude",Bold],
{{noiseAmp, 0.1, "b"}, 0.1, 10, 0.1,Appearance->"Labeled",ImageSize->Small},
Delimiter,
Style["DFT-Parameter",Bold],
{{nbr, 512, "N"}, {512, 1024, 4096 }},
{{window, 1, "Fenster"}, {1 ->"Rechteck", 2 ->"Hanning", 3 ->"Blackman"}},
{{scale, 2, "Skalierung"}, {1 ->"lin", 2 ->"dBV"}},
ControlPlacement->Left, SaveDefinitions->True, TrackedSymbols->{f2, amp2, noiseAmp, nbr, window, scale}]