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
Nein, die Anzahl der Samples kann auch ungerade sein.
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.
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.
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.
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)
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)
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.