Forum: Digitale Signalverarbeitung / DSP / Machine Learning Frage zur diskreten Fourier-Transformation (nicht FFT)


von Manfred M. (bittbeisser)


Lesenswert?

Ich habe jetzt meine Hardcover Ausgabe des DSP-Guides bekommen und 
experimentiere gerade mit den einfachen Beispielen von DFT und IDFT (in 
dem Buch als table 8-1 und 8-2). Natürlich habe ich das erstmal in C 
übersetzt.

Eine wichtige Sache habe ich aber noch nicht verstanden bzw. in dem Buch 
nicht gefunden.

Ist es richtig, dass die Anzahl der Eingangssamples immer eine gerade 
Zahl sein muss? Bei allen Beispielen ist das so, aber es wird (bisher) 
nirgends explizit erwähnt. In einem ordentlichen Programm müsste ich bei 
den Eingabedaten diese Bedingung ggf. ja überprüfen.

: Bearbeitet durch User
von C Programmierer (Gast)


Lesenswert?

Nein, die Anzahl der Samples kann auch ungerade sein.

von Manfred M. (bittbeisser)


Lesenswert?

Das habe ich befürchtet und dadurch bekomme ich ein Problem.

Wie viele komplexe Ergebniswerte bekomme ich dann? Es heisst ja (N/2)+1 
aber es gibt keine halben Abtastwerte.

von C Programmierer (Gast)


Lesenswert?

Dann hast du eine andere Formel als ich und als wikipedia.

Aus n Abtastwerten kommen n Frequenzen raus. Aber vielleicht benutzt du 
eine spezielle DFT, die ausschließlich für reelle Eingangswerte 
funktioniert?

Sofern die Abtastwerte reell sind (was ja in der Regel der Fall ist), 
kann man nach der DFT N/2-1 bzw. (N-1)/2 Frequenzenpaare wiederum 
zusammenfassen, da die DFT sowohl Amplituden für negative als auch für 
positive Frequenzen ausspuckt.

von Manfred M. (bittbeisser)


Lesenswert?

Der Autor (die Quelle hatte ich ja bereits angegeben) erwähnt 
tatsächlich, dass die komplexe DFT in einem späteren Kapitel behandelt 
wird.

Aber ich glaube ich habe jetzt des Rätsels Lösung gefunden. Es ist 
tatsächlich (N/2)+1. Aber es muss eine Integer Division sein. Ich habe 
die Berechnung einfach mal weiter laufen lassen, um zu sehen was 
passiert. Und man sieht tatsächlich, wie das Spektrum fortgesetzt wird:
1
Betragswerte skaliert!
2
:~/prog/filter$ ./dft_f
3
N = 31
4
  0:     0.47140     7.07100     0.00000
5
  1:     0.51919     7.33666     2.61246
6
  2:     0.71264     8.42349     6.58128
7
  3:     1.45407    12.64651    17.77043
8
  4:    10.07158   -53.55034  -141.26443
9
  5:     1.13306    -2.27744   -16.84266
10
  6:     0.61587     0.65742    -9.21465
11
  7:     0.43384     1.67193    -6.28917
12
  8:     0.34266     2.16888    -4.65981
13
  9:     0.28902     2.45424    -3.57364
14
 10:     0.25460     2.63297    -2.76624
15
 11:     0.23148     2.75024    -2.11944
16
 12:     0.21576     2.82963    -1.57083
17
 13:     0.20523     2.88088    -1.08490
18
 14:     0.19874     2.91227    -0.63709
19
 15:     0.19565     2.92717    -0.21015 << letzter Wert
20
 16:     0.19565     2.92717     0.21015 << 
21
 17:     0.19874     2.91227     0.63709
22
 18:     0.20523     2.88088     1.08490
23
 19:     0.21576     2.82963     1.57083
24
 20:     0.23148     2.75024     2.11944
25
 21:     0.25460     2.63297     2.76624
26
----
27
:~/prog/filter$ ./dft_f
28
N = 32
29
  0:     0.00000    -0.00000     0.00000
30
  1:     0.00000     0.00000    -0.00000
31
  2:     0.00000    -0.00000    -0.00000
32
  3:     0.00000     0.00000    -0.00000
33
  4:     9.99995     0.00000  -159.99923
34
  5:     0.00000     0.00000     0.00000
35
  6:     0.00000     0.00000     0.00000
36
  7:     0.00000     0.00000    -0.00000
37
  8:     0.00000     0.00000     0.00000
38
  9:     0.00000    -0.00000     0.00000
39
 10:     0.00000    -0.00000     0.00000
40
 11:     0.00000    -0.00000     0.00000
41
 12:     0.00005     0.00000     0.00077 < 3*f wg. 0.707 bei Eingabe
42
 13:     0.00000     0.00000     0.00000
43
 14:     0.00000     0.00000    -0.00000
44
 15:     0.00000    -0.00000    -0.00000
45
 16:     0.00000     0.00000    -0.00000 << letzter Wert & Symmetrieachse
46
 17:     0.00000     0.00000     0.00000
47
 18:     0.00000    -0.00000     0.00000
48
 19:     0.00000     0.00000     0.00000
49
 20:     0.00005     0.00000    -0.00077
50
 21:     0.00000    -0.00000    -0.00000
51
----
Die Eingangswerte sind 32 Samples, die genau 4 Sinusschwingungen 
ergeben, was dann bei 31 Samples natürlich nicht mehr passt.

von C Programmierer (Gast)


Lesenswert?

Ich kann das nicht richtig nachvollziehen. Was genau sind die einzelnen 
Spalten der Tabellen?

Machen wir doch mal eine einfache Probe, ob du das gleiche rausbekommst 
wie ich nach dem zusammenfügen von positiven und negativen Frequenzen:

x = [2 3 -4]

X = [1 2,5-i*6,06 2,5+i*6,06]

XReal = [0,33 1,67-i*4,04]

x[k] = 0,33 + 4,37 * cos(2*pi*k/3-1,18)

von Manfred M. (bittbeisser)


Lesenswert?

Ich bin leider noch nicht soweit, das ich den Test jetzt komplett 
nachvollziehen kann. Aber der Reihe nach.

Die Spalten sind:
  Index des  Ausgabewertes
  Betrag (skaliert mit Anzahl Ausgabewerte)
  Realteil
  Imaginärteil

Der verwendete Algorithmus ist von hier: 
http://www.dspguide.com/ch8/6.htm (TABLE 8-2).

Die Testwerte habe ich jetzt mal eingegeben. Es sind gewisse 
Ähnlichkeiten im Ergebnis erkennbar, aber ich bin nicht sicher ob Du das 
auch so siehst.
1
  0:     1.00000     1.00000     0.00000
2
  1:     6.55744     2.50000    -6.06218
(diesmal ohne Skalierung)

von C Programmierer (Gast)


Lesenswert?

Deine DFT Formel scheint einfach nach der Hälfte der errechneten Werte 
abzubrechen. Warum auch nicht, wenn die andere Hälfte die konjugiert 
komplexen Zahlen von bereits berechneten Ergebnissen sind...

Um jetzt auf das Signal x wieder zu kommen, musst du anscheinend von 
allen Zeilen außer der ersten den Real- und Imaginärteil jeweils mit 2 
multiplizieren und alle Zeilen, inklusive der ersten durch die Anzahl 
teilen.

Dann erhälst du die gleichen Werte wie in meinem XReal Array und kannst 
daraus schließlich den Test mit der / den cos-Funktion(en) machen, ob 
das ursprüngliche x Array aus dem errechneten Spektrum wieder 
herauskommt.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.