Schnelle Fouriertransformation - nicht ganzzahlige Anzahl von Zyklen in der FFT-Apertur


15

Auf dieser Website (eletronics.se) gibt es einige ausgezeichnete Diskussionsfäden und Antworten zur Theorie der Fouriertransformationen. Ich habe versucht, dasselbe in einem Simulationstool (MS Excel :) zu implementieren.

Ich habe einige Interpretations- und Implementierungsprobleme bezüglich derselben. Ich versuche eine Spannungswellenform von 50 Hz zu analysieren. Die folgenden Daten sind jedoch nur Dummy-Daten, die versuchen, einen konzeptionellen Rahmen für die Implementierung auf einem speicher- und verarbeitungsleistungsbeschränkten 16-Bit-Embedded-Low-Cost-Prozessor zu erstellen.


ETA (30. Mai 2012)

TL; DR-Version:

Für electronics.se war es selbstverständlich, aber ich verwende einen eingebetteten Prozessor mit eingeschränkter Speicher- und Verarbeitungsleistung.

Hier gibt es ein paar Fragen, die noch offen sind:

  1. Wie wird die Fensterung für die Samples durchgeführt, ohne den Speicherbedarf des Algorithmus signifikant zu erhöhen? Ich möchte, dass dies eine grundlegende schrittweise Beschreibung ist, da ich für DSP ziemlich neu bin.
  2. Warum wurden die Größen halbiert, als ich 41 Abtastwerte interpolierte, um 32 abzuleiten, blieben aber unverändert (mit Ausnahme einiger Störungen), als ich sie interpolierte, um 64 abzuleiten?

Ich erkläre ein Kopfgeld für die Frage mit der Hoffnung, dass ich einige ausgezeichnete Antworten bekomme, die für einen DSP-Neuling umsetzbar sind.


Versuch 1:

Zeitbereichseingabe

Ich habe eine Sinuswelle mit erzeugt, um 64 Samples zu erzeugen. Ich fügte dann 30% 3 R d Harmonischen, 20% 5 t hSünde(2nπ/64)3rd5th Harmonischen, 15% Harmonischen, 10% 9 - T h Harmonischen und 20% 11 t h Harmonischen. Dies führte zu folgenden Beispielen:7th9th11th

0, 0.628226182, 0.939545557, 0.881049194, 0.678981464, 0.602991986, 0.719974543, 
0.873221372, 0.883883476, 0.749800373, 0.636575155, 0.685547957, 0.855268479, 
0.967780108, 0.904799909, 0.737695292, 0.65, 0.737695292, 0.904799909, 0.967780108, 
0.855268479, 0.685547957, 0.636575155, 0.749800373, 0.883883476, 0.873221372, 
0.719974543, 0.602991986, 0.678981464, 0.881049194, 0.939545557, 0.628226182, 0, 
-0.628226182, -0.939545557, -0.881049194, -0.678981464, -0.602991986, -0.719974543, 
-0.873221372, -0.883883476, -0.749800373, -0.636575155, -0.685547957, -0.855268479, 
-0.967780108, -0.904799909, -0.737695292, -0.65, -0.737695292, -0.904799909, 
-0.967780108, -0.855268479, -0.685547957, -0.636575155, -0.749800373, -0.883883476, 
-0.873221372, -0.719974543, -0.602991986, -0.678981464, -0.881049194, -0.939545557,
-0.628226182

Und diese Wellenform:

Zeitbereich-Wellenform 64 tastet Periode 64 ab

Ich habe eine DFT dieser Samples basierend auf einem Radix 2-Algorithmus genommen und diese Werte erhalten:

0, -32i, 0, -9.59999999999999i, 0, -6.4i, 0, -4.79999999999999i, 0, -3.20000000000001i,
0, -6.4i, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6.4i, 0, 3.19999999999999i, 0, 4.8i, 0,
6.4i, 0, 9.60000000000001i, 0, 32i

Ausgehend von den Absolutwerten der obigen komplexen Zahlen als Verhältnis zum Fundamentalwert (2. Wert) und dem Ignorieren von Phaseninformationen (falls vorhanden) ermittelte ich die Größen der eingespeisten harmonischen Komponenten genau so, wie sie eingespeist wurden.

Darstellung des Frequenzbereichs

Bildbeschreibung hier eingeben

So weit, ist es gut.


Versuch 2:

Zeitbereichseingabe

Ich habe wieder eine Sinuswelle mit erzeugt, um 64 Samples zu erzeugen. Warum 41? Weil meine Mikrocontroller bei der tatsächlichen Implementierung ADC-Samples an einem Vielfachen des externen Oszillators abtasten und ich nur wenige Arten von Kristallen zur Verfügung habe. Ich fügte dann 30% 3 R d Harmonischen, 20% 5 t h Harmonischen, 15% 7 t hSünde(2nπ/41)3rd5th7th9th11th

0, 0.853079823, 0.857877516, 0.603896038, 0.762429734, 0.896260999, 0.695656841, 
0.676188057, 0.928419527, 0.897723205, 0.664562475, 0.765676034, 0.968738879, 
0.802820512, 0.632264626, 0.814329015, 0.875637458, 0.639141079, 0.696479632, 
0.954031849, 0.50925641, -0.50925641, -0.954031849, -0.696479632, -0.639141079, 
-0.875637458, -0.814329015, -0.632264626, -0.802820512, -0.968738879, -0.765676034, 
-0.664562475, -0.897723205, -0.928419527, -0.676188057, -0.695656841, -0.896260999, 
-0.762429734, -0.603896038, -0.857877516, -0.853079823, -6.87889E-15, 0.853079823, 
0.857877516, 0.603896038, 0.762429734, 0.896260999, 0.695656841, 0.676188057, 
0.928419527, 0.897723205, 0.664562475, 0.765676034, 0.968738879, 0.802820512, 
0.632264626, 0.814329015, 0.875637458, 0.639141079, 0.696479632, 0.954031849, 
0.50925641, -0.50925641, -0.954031849 

Und diese Wellenform:

Bildbeschreibung hier eingeben

Ich habe eine DFT dieser Samples basierend auf einem Radix 2-Algorithmus genommen und diese Werte erhalten:

14.03118145099, 22.8331789450432+2.81923657448236i, -17.9313890484703-4.4853739490832i, 
-2.54294462900052-0.971245447370764i, 1.74202662319821+0.944780377248239i, 
-7.2622766435314-5.09627264287862i, -1.5480700475686-1.37872970296476i, 
-0.136588568631116-0.126111953353714i, -3.99554928315394-5.93646306363598i, 
-0.840633449276516-1.60987487366169i, -0.373838501691708-0.955596009389976i, 
-1.326751987645-5.7574455633693i, -0.168983464443025-1.34797078005724i, 
-9.49818315071085E-003-1.20377723286595i, 0.571706242298176-4.14055455367115i,  
0.192891008647316-0.865793520825366i, 0.457088076063747-1.22893647561869i, 
3.15565897700047-5.67394957744733i, -0.573520124828716+0.682717512668197i, 
-0.20041207669728+0.127925509089274i, -7.95516670999013E-002-1.22174958722397E-002i, 
-1.57510358481328E-002-6.44533006507588E-002i, 2.50067192003906E-002-8.46645685508359E-
002i, 5.3665806842526E-002-9.01867018999554E-002i, 7.49143167927897E-002-
8.80550417489663E-002i, 9.11355142202819E-002-8.16075816185574E-002i, 
0.103685444073525-7.25978085593222E-002i, 0.11339684328631-6.20147712757682E-002i, 
0.120807189654211-5.04466357453455E-002i, 0.126272708495893-3.82586162066316E-002i, 
0.130029552904267-2.56872914345987E-002i, 0.132228055573542-1.28943815159261E-002i, 
0.1329519244939, 0.132228055573544+1.28943815159441E-002i, 
0.130029552904267+2.56872914345769E-002i, 0.126272708495892+3.82586162066264E-002i, 
0.12080718965421+5.04466357453468E-002i, 0.113396843286315+6.20147712757588E-002i, 
0.103685444073529+7.25978085593135E-002i, 9.11355142202805E-002+8.16075816185583E-002i, 
7.4914316792795E-002+8.80550417489592E-002i, 5.36658068425271E-002+9.01867018999563E-
002i, 2.50067192003947E-002+8.46645685508275E-002i, -1.57510358481296E-
002+6.44533006507526E-002i, -7.95516670999005E-002+1.22174958722402E-002i, 
-0.20041207669728-0.127925509089278i, -0.573520124828709-0.682717512668206i, 
3.15565897700049+5.67394957744733i, 0.45708807606375+1.22893647561869i, 
0.192891008647318+0.865793520825373i, 0.571706242298199+4.14055455367114i, 
-9.49818315070294E-003+1.20377723286595i, -0.168983464443023+1.34797078005724i, 
-1.32675198764498+5.75744556336931i, -0.373838501691692+0.955596009389972i, 
-0.840633449276515+1.6098748736617i, -3.99554928315393+5.93646306363599i, 
-0.136588568631125+0.126111953353722i, -1.54807004756858+1.37872970296476i, 
-7.26227664353139+5.09627264287866i, 1.7420266231982-0.944780377248243i, 
-2.54294462900053+0.971245447370785i, -17.9313890484703+4.48537394908326i, 
22.8331789450432-2.81923657448243i

Darstellung des Frequenzbereichs

Bildbeschreibung hier eingeben

Die Größen der obigen komplexen Zahlen lassen nichts erkennen , was ich auf die injizierten Werte im Zeitbereich zurückführen könnte.


Versuch 3

Zeitbereichseingabe:

Ich nahm jetzt die gleiche Wellenform und füllte sie mit Nullen auf, dh stellte alle Samples jenseits von 41 auf Null. Das Folgende ist also die Zeitdomäneneingabe:

0, 0.853079823, 0.857877516, 0.603896038, 0.762429734, 0.896260999, 0.695656841,  
0.676188057, 0.928419527, 0.897723205, 0.664562475, 0.765676034, 0.968738879, 
0.802820512, 0.632264626, 0.814329015, 0.875637458, 0.639141079, 0.696479632, 
0.954031849, 0.50925641, -0.50925641, -0.954031849, -0.696479632, -0.639141079, 
-0.875637458, -0.814329015, -0.632264626, -0.802820512, -0.968738879, -0.765676034, 
-0.664562475, -0.897723205, -0.928419527, -0.676188057, -0.695656841, -0.896260999, 
-0.762429734, -0.603896038, -0.857877516, -0.853079823, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0

Und die Wellenform:

Bildbeschreibung hier eingeben

Ich habe eine DFT dieser Samples basierend auf einem Radix 2-Algorithmus genommen und diese Werte erhalten:

0, 20.0329458083285-9.47487772467906i, -10.5723252177717-8.67648307596821i, 
-8.88751906208901E-002+0.354809649783859i, 3.59322342970171-0.714736578926027i, 
-3.28379151210465-4.42768029850565i, -0.232297876050463+0.434598758428557i, 
1.68672762980862+8.28636148716246E-002i, -1.54927040705738-3.7402696285012i, 
-0.551413356435698+0.608390885175318i, 0.616809338622588+0.187107067289195i, 
-0.458965526924983-3.09409425549091i, -0.966784216252588+0.645984560777537i, 
7.03082277241579E-003+4.21411299459407E-003i, 0.196179960454289-1.99184856512683i, 
-0.919089774378072+0.328855579674163i, 0.222736292145887+0.222736292145884i, 
1.23799833509466-3.45997355924453i, -3.29198268057418+0.324231994037239i, 
-0.495840326552116-0.827259606915814i, -0.434268223171498+0.649928325340974i, 
-1.13740282784196-0.168717771696843i, -8.50255402020411E-002-0.280291642522456i, 
-0.495871287837938+0.449431537929797i, -0.705190861543966-0.292099618913078i, 
-1.8498657760867E-003-3.76548829156425E-002i, -0.56327531746565+0.301076929791613i, 
-0.445444858519027-0.330364422654705i, -2.53084763487132E-002+0.12723430263342i, 
-0.608135034699087+0.152329896227613i, -0.254967975468-0.31067937701979i, 
-0.114451748984804+0.241987891739128i, -0.623647028694518, -0.114451748984793-
0.241987891739111i, -0.254967975467992+0.310679377019776i, -0.608135034699088-
0.152329896227612i, -2.53084763487126E-002-0.127234302633416i, 
-0.445444858519022+0.330364422654704i, -0.563275317465649-0.301076929791616i, 
-1.84986577609081E-003+3.76548829156447E-002i, -0.705190861543962+0.292099618913075i, 
-0.495871287837939-0.449431537929793i, -8.50255402020378E-002+0.280291642522452i, 
-1.13740282784196+0.168717771696845i, -0.434268223171501-0.649928325340972i, 
-0.495840326552115+0.827259606915815i, -3.29198268057417-0.324231994037237i, 
1.23799833509466+3.45997355924453i, 0.222736292145887-0.222736292145884i, 
-0.919089774378077-0.328855579674149i, 0.1961799604543+1.99184856512683i, 
7.03082277241257E-003-4.21411299459534E-003i, -0.966784216252593-0.645984560777534i, 
-0.458965526924974+3.09409425549092i, 0.616809338622592-0.187107067289204i, 
-0.551413356435713-0.608390885175314i, -1.54927040705737+3.74026962850121i, 
1.68672762980861-8.28636148716247E-002i, -0.232297876050455-0.434598758428559i, 
-3.28379151210465+4.42768029850566i, 3.59322342970171+0.714736578926018i, 
-8.88751906209093E-002-0.354809649783852i, -10.5723252177717+8.67648307596825i, 
20.0329458083285+9.47487772467899i 

Darstellung des Frequenzbereichs

Bildbeschreibung hier eingeben

Auch hier zeigen die Größen der obigen komplexen Zahlen nichts, was ich auf die injizierten Werte im Zeitbereich zurückführen kann.


ETA Da die Antworten hier auf ein Fenster hindeuteten, habe ich ein weiteres Experiment durchgeführt und nach vielen Fehlstarts die folgenden Ergebnisse erzielt.

Versuch 4

Darstellung im Zeitbereich

0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.853079823, 0.857877516, 0.603896038,
0.762429734, 0.896260999, 0.695656841, 0.676188057, 0.928419527, 0.897723205, 
0.664562475, 0.765676034, 0.968738879, 0.802820512, 0.632264626, 0.814329015, 
0.875637458, 0.639141079, 0.696479632, 0.954031849, 0.50925641, -0.50925641, 
-0.954031849, -0.696479632, -0.639141079, -0.875637458, -0.814329015, -0.632264626, 
-0.802820512, -0.968738879, -0.765676034, -0.664562475, -0.897723205, -0.928419527, 
-0.676188057, -0.695656841, -0.896260999, -0.762429734, -0.603896038, -0.857877516, 
-0.853079823, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0

Sieht aus wie:

Bildbeschreibung hier eingeben

Hamming-Fensterkoeffizienten

0.08, 0.082285843, 0.089120656, 0.100436509, 0.116120943, 0.136018076, 0.159930164, 
0.187619556, 0.218811064, 0.253194691, 0.290428719, 0.330143098, 0.371943129, 
0.415413385, 0.460121838, 0.505624157, 0.551468118, 0.597198104, 0.64235963, 
0.686503859, 0.729192067, 0.77, 0.808522089, 0.844375485, 0.877203861, 0.906680953, 
0.932513806, 0.954445679, 0.972258606, 0.985775552, 0.99486218, 0.999428184, 
0.999428184, 0.99486218, 0.985775552, 0.972258606, 0.954445679, 0.932513806, 
0.906680953, 0.877203861, 0.844375485, 0.808522089, 0.77, 0.729192067, 0.686503859, 
0.64235963, 0.597198104, 0.551468118, 0.505624157, 0.460121838, 0.415413385, 
0.371943129, 0.330143098, 0.290428719, 0.253194691, 0.218811064, 0.187619556, 
0.159930164, 0.136018076, 0.116120943, 0.100436509, 0.089120656, 0.082285843, 0.080.08, 
0.082285843, 0.089120656, 0.100436509, 0.116120943, 0.136018076, 0.159930164, 
0.187619556, 0.218811064, 0.253194691, 0.290428719, 0.330143098, 0.371943129, 
0.415413385, 0.460121838, 0.505624157, 0.551468118, 0.597198104, 0.64235963, 
0.686503859, 0.729192067, 0.77, 0.808522089, 0.844375485, 0.877203861, 0.906680953, 
0.932513806, 0.954445679, 0.972258606, 0.985775552, 0.99486218, 0.999428184, 
0.999428184, 0.99486218, 0.985775552, 0.972258606, 0.954445679, 0.932513806, 
0.906680953, 0.877203861, 0.844375485, 0.808522089, 0.77, 0.729192067, 0.686503859, 
0.64235963, 0.597198104, 0.551468118, 0.505624157, 0.460121838, 0.415413385, 
0.371943129, 0.330143098, 0.290428719, 0.253194691, 0.218811064, 0.187619556, 
0.159930164, 0.136018076, 0.116120943, 0.100436509, 0.089120656, 0.082285843, 0.08

Sieht aus wie das

Bildbeschreibung hier eingeben

Ihr Produkt (Wäre es nur ein einfaches Produkt?)

0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.354380777, 0.394728179, 0.305344425, 
0.420455691, 0.53524537, 0.446861871, 0.464205711, 0.676996154, 0.691246868, 
0.537313441, 0.646518073, 0.849781485, 0.727902068, 0.589595493, 0.77723281, 
0.851346054, 0.63004965, 0.692901245, 0.953486318, 0.508965209, -0.506639943, 
-0.940461272, -0.677158316, -0.610025441, -0.816544018, -0.738336608, -0.554624971, 
-0.67788196, -0.783246782, -0.589570546, -0.484593685, -0.616290445, -0.596379223, 
-0.403818226, -0.383632569, -0.453171212, -0.350810571, -0.250866497, -0.319081647, 
-0.281638415, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0

Aussehen wie:

Bildbeschreibung hier eingeben

Darstellung des Frequenzbereichs

1.01978454171002, -1.04956742046721-14.885596686908i, 
0.729587297164687+12.4883097743251i, -0.393281811348907-4.24261013057826i, 
0.761581725234628+3.2398820477072i, -0.876737136684714-3.79393194973719i, 
0.480276094694696+1.88418789653125i, -0.735142602781246-1.8175563772351i, 
1.02811278581892+2.5331069394699i, -0.584707361656586-1.41705783059227i, 
0.642189640425863+1.09157435002371i, -1.08027274688044-1.77950446999262i, 
0.690373934734768+1.16057125940753i, -0.45786262480057-0.586349217392973i, 
0.837117486838485+0.985681387258948i, -0.684335876271999-0.810862267851556i, 
0.930190039748881+0.842491953501215i, -2.11497450796919-1.82531206712061i, 
1.77660184883125+1.59539043421572i, -8.20687157856373E-003-0.123202767234891i, 
-0.280149317662962-0.244195928734504i, -0.313777442633104-0.174757927010731i, 
-5.83069102281942E-002+1.54514819958589E-002i, 0.211135948552966+0.12606544182717i, 
0.227409826380236+7.86489707052085E-002i, 2.49029866186928E-003-3.26908578232317E-002i, 
-0.204885728671642-7.60371335974082E-002i, -0.174609549526536-2.58285031988847E-002i, 
4.55943100777029E-002+3.62216126377679E-002i, 0.205437067084294+3.66474457853982E-002i, 
0.130866115437055-7.39089659931302E-003i, -8.90307098969982E-002-2.75195665163235E-
002i, -0.206016142964952, -8.90307098969848E-002+2.75195665163199E-002i, 
0.130866115437044+7.39089659931835E-003i, 0.205437067084297-3.66474457854036E-002i, 
4.55943100777004E-002-3.62216126377661E-002i, -0.174609549526531+2.58285031988801E-
002i, -0.204885728671643+7.60371335974132E-002i, 2.49029866187001E-
003+3.26908578232264E-002i, 0.227409826380234-7.86489707052067E-002i, 0.21113594855297-
0.126065441827174i, -5.83069102281978E-002-1.54514819958551E-002i, 
-0.313777442633101+0.174757927010727i, -0.280149317662962+0.244195928734507i, 
-8.20687157856043E-003+0.123202767234886i, 1.77660184883125-1.59539043421572i, 
-2.11497450796919+1.82531206712061i, 0.930190039748879-0.842491953501215i, 
-0.684335876271989+0.810862267851559i, 0.837117486838478-0.985681387258952i, 
-0.457862624800567+0.586349217392971i, 0.690373934734765-1.16057125940753i, 
-1.08027274688043+1.77950446999263i, 0.642189640425861-1.09157435002371i, 
-0.584707361656583+1.41705783059227i, 1.02811278581891-2.5331069394699i, 
-0.735142602781236+1.81755637723511i, 0.480276094694689-1.88418789653125i, 
-0.876737136684699+3.79393194973719i, 0.76158172523462-3.2398820477072i, 
-0.393281811348889+4.24261013057827i, 0.729587297164646-12.4883097743252i, 
-1.04956742046715+14.885596686908i

Sieht aus wie das:

Bildbeschreibung hier eingeben

Sind diese gültigen Ergebnisse?Weil ich immer noch nicht weiterkomme!


Ich habe zwei weitere Experimente durchgeführt und scheint den beabsichtigten Ergebnissen auf verblüffende Weise nahe zu sein, aber die Lösung fühlt sich für mich wie ein Hacker an.

Versuch 5

3rd5th7th9th11th

0, 0.853079823, 0.857877516, 0.603896038, 0.762429734, 0.896260999, 0.695656841, 
0.676188057, 0.928419527, 0.897723205, 0.664562475, 0.765676034, 0.968738879, 
0.802820512, 0.632264626, 0.814329015, 0.875637458, 0.639141079, 0.696479632, 
0.954031849, 0.50925641, -0.50925641, -0.954031849, -0.696479632, -0.639141079, 
-0.875637458, -0.814329015, -0.632264626, -0.802820512, -0.968738879, -0.765676034, 
-0.664562475, -0.897723205, -0.928419527, -0.676188057, -0.695656841, -0.896260999, 
-0.762429734, -0.603896038, -0.857877516, -0.853079823.

Ich habe eine lineare Interpolation durchgeführt und daraus 64 Samples abgeleitet. Sie sahen wie folgt aus:

Bildbeschreibung hier eingeben

Die Frequenzbereichsdarstellung im Vergleich zur gewünschten idealen Ausgabe (erstes Experiment) ist wie folgt:

Bildbeschreibung hier eingeben

Ich habe die zweite Hälfte des Probenraums entfernt, da sich die Komponenten nach dem Nyquist-Limit falten. Es gibt eine geringe Dämpfung bei den interessierenden Frequenzen, aber ein Grundrauschen wird über das Spektrum hinzugefügt. Erklärungen?


Versuch 6

Wie Experiment 5 , jedoch 32 interpolierte Abtastwerte.

Bildbeschreibung hier eingeben

Frequenzbereichsvergleich:

Bildbeschreibung hier eingeben

Die Verhältnisse stimmen, aber die Größen halbieren sich! Warum?


Ich kann also schlussfolgern und mich irren (ich hoffe es), dass, wenn die Anzahl der Abtastungen in einer vollständigen Wellenformperiode keine Potenz von 2 ist, die FFT derselben ohne irgendeine Operation nichts preisgibt Das entgeht mir im Moment.

Welche Optionen stehen mir zur Verfügung, um die Werte, die ich im Zeitbereich injiziert habe, zurückzugewinnen, da ich nur sehr wenig Kontrolle über die Abtastfrequenz habe?


Können Sie statt einer großen Liste von Zahlen einen Graphen der DFT-Ausgabe veröffentlichen? Es ist ziemlich schwierig, sich eine ungefähre Vorstellung von der Ausgabe zu machen, nur als eine große Liste von Zahlen.
Fake Name

Möchten Sie eine Darstellung der Größen (Absolutwerte)?

Ist das jetzt in Ordnung?

Ich denke, dass das Fenstern über nur einen Zeitraum nicht gut funktioniert, genauso wie die DFT über einen Zeitraum ohne Fenster. Es gibt keine Spur Ihres ursprünglichen Signals.

1
Ich bin mir nicht sicher, was du mit dem Kopfgeld anfangen willst. Ich sehe nur einen großen Haufen Parzellen mit einigen vereinzelten Kommentaren und vagen Fragen. Das Verständnis der Feinheiten der DFT und des Fensters erfordert mindestens einige theoretische Studien in DSP. Ich würde Lyons 'Einführungsbuch empfehlen . Zweitens, was ist Ihre spezielle Frage zur Implementierung von Fenstern? Es ist eine einfache Technik, und Sie werden am besten verstehen, wie Sie sie in Ihrem eingeschränkten System implementieren können.
Jason R

Antworten:


12

Willkommen beim Fensterbau. Mit William G. nichts zu tun

Die einfachste Methode, mit der die Rauschfehler durch Mittelwertbildung brachial unterdrückt werden, besteht darin, eine große Anzahl von Zyklen abzutasten, damit die Randbedingungen nicht vorherrschen.

Ich habe Ihre numerischen Ergebnisse nicht angeschaut, aber:

Sehen Sie sich die zweite und dritte Grafik an.
Die von Ihnen angezeigten Wellenformen sind die Wellenformen, die analysiert werden.
Das erste Beispiel hat 2 positive und eine negative Halbwelle.
Ich würde erwarten, dass es in der 3. Harmonischen sehr stark ist und in anderen ungeraden Harmonischen vernünftigerweise nicht, und wahrscheinlich bei viel niedrigeren geraden. Das ist eine intuitive Vermutung.
Unabhängig vom Ergebnis beschreibt die Transformation (korrekt), was sie sieht und was Sie sehen.

Ich würde erwarten, dass das zweite Beispiel sehr schwer darzustellen ist und eine große Anzahl von Hochfrequenzkomponenten benötigt. Es ist 1/3 + ve, 1/3 -ve und 1/3 Null. Es ist eine Schande zu sagen, wie Sie leicht die Ausgabe für die rechte Hand auf Null bringen können, ohne dass sich eine große Anzahl nahezu gleicher Hochfrequenzterme mit etwa entgegengesetzter Phase gegenseitig aufhebt.

SO

Die DFT oder FFT sagt, was sie sieht. Sie müssen ganzzahlige Wellenformen des interessierenden Signals einspeisen oder die Endpunkte besonders berücksichtigen. Für letztere Aufgabe gibt es eine ganze Kunstform. Begriffe wie Windowing, Raised Cosine, Hamming Window (und vieles mehr) werden Sie auf Ihre Reise starten.

Wikipedia - Cooley Hann Lanczos Hamming Blackman Kaiser Nutttall und viele Freunde :-)

Wahrscheinlich nützlich

National Instruments und wieder hier

DFT-Spektrumanalyse


Das dritte Drittel der dritten Wellenform wurde hier und in der Firmware während der Implementierung zwangsweise auf Null gesetzt.

5
Wenn Sie einen Teil des Signals auf Null setzen, werden die Daten nur durch ein rechteckiges Fenster mit einem kürzeren Rechteck angezeigt, wodurch das Ergebnis mit einer breiteren Sinc-Funktion zusammengefasst wird.
hotpaw2

@ VaibhavGarg - Die Nullen befinden sich in der Tabelle und in Ihrem Diagramm. Also nahm ich an, dass sie in Ihrer Analyse sind. In diesem Fall gelten die allgemeinen Bemerkungen. Wenn nicht, müssen Sie ändern, was Sie zeigen.

@RussellMcMahon Yup- Ich stimme zu.

Durch das Fenstern einer ganzzahligen Anzahl von Perioden werden die Nullen des Sinus an den harmonischen Abstand angeglichen, wodurch ein Leck zwischen den Harmonischen verhindert wird, wenn das Fensterspektrum gefaltet wird. Hier ist eine 1024-Punkte-DFT (interpoliert mit Null-Auffüllung) für die Experimente 2 und 3 (dh 64-Punkte-Rechteckfenster gegenüber 41-Punkte-Rechteckfenster). Die idealen Werte sind als blaue Punkte dargestellt. Experiment 2 zeigt die spektrale Streuung (insbesondere bei den geraden Harmonischen, die Null sein sollten), aber Experiment 3 ist bei den Harmonischen korrekt.
Eryk Sun

7

Die FFT-Ergebnisse zeigen tatsächlich alles über die ursprünglich eingespeisten Frequenzen. Da die injizierten Frequenzen in der FFT-Aperturlänge nicht genau periodisch waren, wurden die Frequenzen aufgrund dieser nicht periodenbezogenen Fensterung in Sinc-Wellenformen umgewandelt und dann erneut abgetastet. Um die ursprünglichen Frequenzen wiederherzustellen, müssen Sie möglicherweise die FFT dekonvolvieren, interpolieren und neu skalieren.


Könnten Sie bitte die 3 Schritte veranschaulichen? Ich kann Ihnen die Excel-Datei mit den Original-Samples senden, mit denen Sie spielen können, wenn Sie möchten.

6

Dies ist keineswegs eine vollständige Antwort, und ich erwarte nicht, dass sie akzeptiert wird, aber ich denke auch, dass diese Antwort einen erheblichen pädagogischen Wert hat.

Ich kann also schlussfolgern und mich irren (ich hoffe es), dass, wenn die Anzahl der Abtastungen in einer vollständigen Wellenformperiode keine Potenz von 2 ist, die FFT derselben ohne irgendeine Operation nichts preisgibt Das entgeht mir im Moment.

Sie haben größtenteils recht. Die FFT nutzt die Symmetrie von Frequenzabtastwerten entlang des Einheitskreises in der z-Ebene:

Allgemeiner Einheitenkreis

Wenn Ihre Anzahl von Abtastwerten eine Potenz von 2 ist, wie oben gezeigt, können Sie Symmetrie sowohl über die reale Achse als auch über die imaginäre Achse sehen. Im Wesentlichen verwendet die FFT diese Symmetrie, um die Abtastwerte auf einen Quadranten (oder weniger - nicht sicher, ob die Details dieser Symmetrie zutreffen) des Einheitskreises zu reduzieren. Dies bedeutet, dass die FFT im Verhältnis zum gesamten Frequenzbereich nur eine geringe Anzahl von Berechnungen durchführen muss.

Mit dem Auffüllen mit Nullen können Sie die Auflösung der FFT erhöhen, indem Sie Nullen hinzufügen, um eine höhere Leistung von 2 Abtastwerten zu erzielen. Die Symmetrie ist immer noch da, es sind nur noch mehr Samples im Einheitskreis gepackt.

Wenn Sie also KEINE Potenz von 2 haben, werden weniger robuste FFTs für Sie nicht auf Null gesetzt, und Sie können in Ihrer Ausgabe auf Aliasing stoßen.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.