DIY Fensterfunktionen

In der digitalen Signalverarbeitung werden Fensterfunktionen hĂ€ufig verwendet, um das Signal zeitlich zu begrenzen, und ihre Namen sind jedem bekannt, der auf die eine oder andere Weise auf die diskrete Fourier-Transformation gestoßen ist: Hann, Hamming, Blackman, Harris und andere. Aber reichen sie aus, ist es möglich, sich etwas Neues auszudenken, und hat das einen Sinn?



In diesem Artikel betrachten wir die Ausgabe einer Fensterfunktion mit neuen Eigenschaften unter Verwendung von Wolfram Mathematica. Es wird auch davon ausgegangen, dass der Leser ein allgemeines VerstÀndnis der digitalen Signalverarbeitung im Kontext des zur Diskussion stehenden Themas hat und zumindest mit dem Artikel aus Wikipedia vertraut ist .







EinfĂŒhrung



Historisch gesehen tauchten die ersten Fensterfunktionen bei Versuchen auf, ihre spektralen Eigenschaften durch Verringern der Amplitude der Nebenkeulen zu verbessern. Wenn das Signal mit der Fensterfunktion multipliziert wird, werden ihre Spektren gefaltet, was einige EinschrĂ€nkungen fĂŒr die Analyse mit sich bringt. Zu dieser Zeit, in den 50er Jahren des 20. Jahrhunderts, erlaubte die Rechenleistung nicht, symbolische Berechnungen einfach und natĂŒrlich zu manipulieren, und die Auswahl der optimalen Parameter war ziemlich schwierig. Dies ist einer der GrĂŒnde, warum die Funktionen mit unterschiedlichen Namen bezeichnet werden - sie, oder vielmehr ihre spektralen Eigenschaften, wurden von verschiedenen Forschern seit geraumer Zeit untersucht. Ein Nebeneffekt davon ist, dass der vorhandene Satz benannter Fensterfunktionen als eine Art "Standardsatz" wahrgenommen wird, außerhalb dessen nichts gefunden werden kann;Gleichzeitig enthalten die Namen dieser Fenster keine Informationen ĂŒber die Eigenschaften und deuten auf eine separate Untersuchung und Speicherung hin.



Einstufung



Alle Fensterfunktionen werden erhalten, indem eine Funktion mit einer rechteckigen multipliziert wird, wodurch die ZeitbeschrÀnkung garantiert wird. Daher können sie zunÀchst nach den von ihnen verwendeten Funktionen klassifiziert werden:



  1. die Summe der Kosinusse. Die umfangreichste Klasse aufgrund der Tatsache, dass ihr Spektrum leicht berechenbar ist und die Summe der gewichteten Sinc-Funktionen ist. Dazu gehören Hann, Hamming, Blackman, Harris ...
  2. stĂŒckweise kontinuierliches Polynom. Sie ergeben sich aus der Faltung einfacher Funktionen - zum Beispiel rechteckig und dreieckig. Gleichzeitig werden ihre Spektren multipliziert und ihr Auffinden ist auch nicht besonders schwierig. Dazu gehören Dirichlet, Triangular, Parzen, Welch ...
  3. alle anderen - unter Verwendung von Exponentialen, Gaußschen, Sinc und anderen, ist die Wahl spezifischer Funktionen eher ideologischer Natur als spezifisch spektraler Eigenschaften.


Sie können auch durch Eigenschaften an den RÀndern unterteilt werden:



  1. Keine LĂŒcken an den Kanten - Werte gleich Null. Die Pausen sind von Dirichlet, Hamming, Blackman-Harris. Nicht haben - Dreieckig, Hann, Nuttal
  2. Fehlen von DiskontinuitÀten des 1. und anderer Derivate


Zwei weitere Fensterfunktionen sind separat hervorzuheben:



  1. Kaiser, mit dem Sie die Breite des Hauptblatts einstellen können;
  2. Dolph-Chebyshev, dessen Nebenkeulen einer bestimmten Amplitude entsprechen.


Beide haben DiskontinuitÀten an den RÀndern von Werten und Ableitungen, und ihre Berechnungen sind mit einigen Schwierigkeiten verbunden - die Kaiser-Funktion wird durch eine spezielle Funktion (Bessel) berechnet, und die Dolph-Chebyshev-Funktion wird im Frequenzbereich bestimmt und durch die inverse diskrete Fourier-Transformation berechnet. Besonders schwierig ist es auch, ihre analytischen Antiderivate zu finden.



Sie können Fensterfunktionen mit dem folgenden einfachen Code auf Unterbrechungen untersuchen:
wins = {DirichletWindow, HammingWindow, BlackmanWindow, 
   BartlettHannWindow, BartlettWindow, BlackmanHarrisWindow, 
   BlackmanNuttallWindow, BohmanWindow, ExactBlackmanWindow, 
   FlatTopWindow, KaiserBesselWindow, LanczosWindow, NuttallWindow};
Table[{f, 
  Table[Limit[D[f[x], {x, k}], x -> 1/2, 
    Direction -> "FromBelow"], {k, 0, 4}]}, {f, wins}]</code>
↓
<img src="https://habrastorage.org/webt/rm/wq/8f/rmwq8fjkjxjcox-czh8zevkbd0m.png" />

<code>Plot[Evaluate[Through[wins[x]]], {x, -1, 1}, PlotRange -> {-0.25, 1}, 
 GridLines -> {{-0.5, -0.25, 0.25, 0.5, 1}}, AspectRatio -> 5/8, 
 PlotLegends -> "Expressions"]


↓





Reverse Engineering



Schauen wir uns die Definitionen der Blackman- und Nuttel-Funktionen an:



BlackmanWindow[x] // FunctionExpand


↓

{150(25cos⁥(2πx)+4cos⁥(4πx)+21)−12≀x≀120|x|>12



NuttallWindow[x] // FunctionExpand


↓

{121849cos⁥(2πx)+36058cos⁥(4πx)+3151cos⁥(6πx)+88942250000−12≀x≀120|x|>12



Sie sind Summen von 3 und 4 Kosinuswellen mit geraden Frequenzen (beginnend bei Null) und einigen Koeffizienten. Woher kommen diese Koeffizienten? Es ist unwahrscheinlich, dass sie von Hand ausgewĂ€hlt wurden, zumindest jeweils einzeln - schließlich gibt es Randbedingungen, die die Fenster unabhĂ€ngig von ihren spektralen Eigenschaften erfĂŒllen mĂŒssen - mindestens gleich eins in der Mitte.



Versuchen wir, die Blackman-Funktion selbst zu "erfinden". Dazu definieren wir eine Funktion mit noch unbekannten Koeffizienten



f = Function[x, a + b Cos[2 Pi x] + c Cos[4 Pi x]];


und ein Gleichungssystem zusammenstellen, das die Randbedingungen definiert - Gleichheit mit der Einheit in der Mitte, Null an den RĂ€ndern und Gleichheit mit Null der Ableitungen an den RĂ€ndern:



ss = Solve[{
   f[0] == 1,
   f[1/2] == 0,
   f'[1/2] == 0
   }, {a, b, c}]


↓





{{b→12,c→12−a}}



Es wurde die Lösung gefunden, aber nicht eine, sondern viele - abhĂ€ngig vom Koeffizienten a , vor dem Wolfram uns höflich gewarnt hat. Aus der gefundenen Lösung definieren wir nun eine neue Funktion in AbhĂ€ngigkeit vom unbekannten Koeffizienten: ↓ Es ist leicht zu erkennen, dass wir fĂŒr a = 0,42 die Blackman-Funktion erhalten. Aber warum genau 0,42? Um diese Frage zu beantworten, mĂŒssen wir ihr Spektrum zeichnen. Die analytische Fourier-Transformation ist nicht die einfachste Aufgabe, aber Wolfram kann sie auch bewĂ€ltigen und erspart uns so die Arbeit.



hx = Function[{x, a},

Piecewise[{{f[x] /. ss[[1]], -1/2 < x < 1/2}}, 0] // Evaluate]
















hw = Function[{w, a}, 
  FourierTransform[hx[x, a], x, w] // #/Limit[#, w -> 0] & // 
    Simplify // Evaluate]


↓



Hinweis
, FourierTransform , — , , — . w. — w, , .







In dieser Form ist der Graph der Funktion immer noch nicht sehr informativ, da es bequemer ist, das Spektrum auf einer logarithmischen Skala zu analysieren. Durch HinzufĂŒgen der entsprechenden Umrechnung in Dezibel20log10⁥(|x|)erhalten wir den gleichen ĂŒblichen Graphen des Spektrums der Fensterfunktionen:



der Code
Manipulate[
 Plot[{
      hw[w, a],
      hw[w, 0.42]
      } // Abs // 20 Log[10, #] & // Evaluate
  , {w, -111, 111}, PlotRange -> {-120, 0}, GridLines -> Automatic, 
  PlotStyle -> {Default, Thin}, PlotPoints -> 50]
 , {{a, 0.409}, 0.3, 0.5}]
↓








Beim Ändern des Parameters werden wir etwas Ähnliches beobachten:







AbhĂ€ngig vom Parameter a Ă€ndert sich der Pegel der Nebenkeulen und bei a = 0,42 ist er mehr oder weniger minimal und gleichmĂ€ĂŸig. Mit a = 0,409 können wir ein etwas besseres Ergebnis erzielen, wenn „besser“ als das minimal mögliche Niveau der Nebenkeulen verstanden wird.



Hinweis
, , .



Entwicklung



Offensichtlich war eine solche Mikrooptimierung die MĂŒhe ĂŒberhaupt nicht wert. Ist es möglich, die Eigenschaften dieses Fensters qualitativ zu verbessern, ohne die Anfangsdaten zu Ă€ndern?



Zuvor haben wir uns die Ausgabe von Fensterfunktionen angesehen, die sich zu eins summieren, sodass Sie das ursprĂŒngliche Signal wiederherstellen können. Probieren wir diese Technik fĂŒr unser Fenster aus und sehen, wie sie sich auf das Spektrum auswirkt.



Definieren wir eine Hilfsfunktion zum Erstellen ĂŒberlappender Fenster unter BerĂŒcksichtigung der Grenzen der ArgumentĂ€nderung im Bereich von -1/2 bis 1/2:







Suchen Sie das Antiderivativ, verschieben Sie es in die Mitte der Koordinaten und skalieren Sie es auf eins:





↓





Zeigen Sie es in der Grafik an:







Wie Sie sehen, hat Wolfram es auch hier alleine gemacht, und wir mussten keine stĂŒckweise kontinuierliche Definition eines Antiderivativs manuell angeben. Jetzt hĂ€ngt die Ansicht unseres Fensters nicht nur von der Variablen a ab , sondern auch vom Grad der Überlappung - und wenn sie zunimmt, tendiert sie zur Form der Ableitung:



der Code
Manipulate[
 Plot[
  OverlapShape[hsx, x, a, t]
  , {x, -1, 1}, PlotRange -> All, GridLines -> Automatic]
 , {{a, 0.404}, 0.4, 0.5}, {{t, 4}, 3, 11}]


↓




Der letzte Schliff besteht darin, eine analytische Funktion fĂŒr das Spektrum zu finden, um den optimalen Wert des Parameters a zu bestimmen .



Wenn wir hier versuchen, die Transformation wie beim letzten Mal direkt zu berechnen, werden wir Wolfram in tiefe Gedanken treiben. Es gibt verschiedene Möglichkeiten, diesen Prozess zu beschleunigen:



- Verwenden Sie eine diskrete Transformation anstelle einer analytischen - die einfachste. Aber ein echter Mathematiker wird keine numerischen Methoden anwenden, bei denen eine rein analytische Lösung gefunden werden kann - und wir werden (noch) nicht; DarĂŒber hinaus weist es offensichtliche EinschrĂ€nkungen auf (in Bezug auf Auflösung und SpektrumbeschrĂ€nkung).



- Übergeben Sie bestimmte Werte als Überlappungsparameter und versuchen Sie anhand der Ergebnisse, das Muster zu erkennen und zu verallgemeinern. Eine ziemlich funktionierende Option, die jedoch zusĂ€tzliche mentale und kreative Anstrengungen erfordert. Lassen wir es als letzten Ausweg.



- Berechnungen direkt im Frequenzbereich durchfĂŒhren. Dies ist aufgrund der folgenden Eigenschaften der Fourier-Transformation möglich:



1) Sie ist linear, d.h. die Summe der Bilder ist gleich dem Bild der Summe;

2) Die Integration in den Zeitbereich entspricht der Division durch iw im Frequenzbereich.

3) Zeitversatz entspricht einer Modulation mit einer komplexen Sinuskurve.

(mehr auf Wikipedia oder hier ).



Wenn wir also das Spektrum hw einer beliebigen Fensterfunktion haben, können wir daraus das Spektrum hwo einer Funktion erhalten, die mit ĂŒberlappendem t zu eins summiert wird :





↓





Nun können wir sehen, wie sich das Spektrum in der Dynamik Àndert:







Hier wirkt sich eine Änderung des Überlappungsparameters bereits auf etwas andere Weise auf das Fensterspektrum aus :







Nachdem Sie ein wenig mit den Parametern gespielt haben, ist es leicht zu bemerken, dass "mehr nicht besser ist" und der optimale Grad der Überlappung fĂŒr diese Funktion im Bereich von vier liegt. Insbesondere fĂŒr t = 4 und a= 0,404 Wir erhalten einen Nebenkeulenpegel von nicht mehr als -80 dB. Dies ist ein sehr gutes Ergebnis - insbesondere wenn man bedenkt, dass die erhöhte Kosinusfunktion, die traditionell fĂŒr summierte Fenster verwendet wird, einen Keulenpegel von etwa -30 dB ergibt. Wenn unsere neue Fensterfunktion explizit ausgeschrieben wird, sieht sie folgendermaßen aus:



der Code
OverlapShape[hsx, x, 404/1000, 4] // PiecewiseExpand // FullSimplify


↓


{404π(1−2x)+36sin⁥(13(16πx+π))+375sin⁥(13(π−8πx))606π14<x≀12404(2πx+π)+36sin⁥(23π(8x+1))+375sin⁥(13(8πx+π))606π−12<x≀−143(125cos⁥(8πx3)+12cos⁥(16πx3))202π+13−14<x≀140|x|>12



Weitere Entwicklung



Was können Sie noch tun, um den Nebenkeulenpegel weiter zu senken? Sie können die Kosinusse nicht mit geraden, sondern mit ungeraden Frequenzen nehmen (hier ist aus GrĂŒnden der Kompaktheit die Lösung des Gleichungssystems direkt in die Definition der Funktion eingebettet):



der Code
hx1 = Function[{x, a},
  a Cos[1 Pi #] + b Cos[3 Pi #] + c Cos[5 Pi #] & // #[x] /. Solve[{
          #[0] == 1,
          #[1/2] == 0,
          #'[1/2] == 0,
          #''[1/2] == 0
          }, {a, b, c}][[1]] & // # UnitBox[x] & // Evaluate]


↓


(acos⁥(πx)+(58−a2)cos⁥(3πx)+(38−a2)cos⁥(5πx))Π(x)



und nach Integration mit den Parametern a = 0,6628 und einem Überlappungspegel von 4,5 erhalten Sie eine DĂ€mpfung von -90 dB:







Explizit:

{327sin⁥(17π(45x+2))+24855sin⁥(17π(1−9x))+3670cos⁥(114π(54x+1))+2151243024518<x≀1224855sin⁥(17π(9x+1))+3670sin⁥(37π(9x+1))+327sin⁥(57π(9x+1))+2151243024−12<x≀−518−3670sin⁥(37π(9x−1))+24855sin⁥(17π(9x+1))+327sin⁥(57π(9x+1))43024++3670sin⁥(37π(9x+1))+327sin⁥(17π(45x+2))+24855sin⁥(17π(1−9x))43024−518<x≀5180|x|>12



Sie können einen weiteren Kosinus hinzufĂŒgen und die Anzahl der Nullableitungen erhöhen:



der Code
hx2 = Function[{x, a},
  a Cos[1 Pi #] + b Cos[3 Pi #] + c Cos[5 Pi #] + 
       d Cos[7 Pi #] & // #[x] /. Solve[{
          #[0] == 1,
          #[1/2] == 0,
          #'[1/2] == 0,
          #''[1/2] == 0,
          #'''[1/2] == 0,
          #''''[1/2] == 0
          }, {b, c, d}][[1]] & // # UnitBox[x] & // Evaluate]


↓


(acos⁥(πx)+180(35−16a)cos⁥(3πx)+180(35−48a)cos⁥(5πx)+140(5−8a)cos⁥(7πx))Π(x)



und nach Integration mit den Parametern a = 0,5862 und dem Überlappungspegel von 6,4 erhalten Sie eine UnterdrĂŒckung von -110 dB:







Explizit:

{−3077550sin⁥(154π(64x−5))−90069sin⁥(554π(64x−5))−5820sin⁥(754π(64x−5))−560455cos⁥(19π(7−32x))+260134452026881132<x≀12560455sin⁥(118π(64x+5))+3077550sin⁥(154π(64x+5))+90069sin⁥(554π(64x+5))+5820sin⁥(754π(64x+5))+26013445202688−12<x≀−1132−3077550sin⁥(154π(64x−5))−90069sin⁥(554π(64x−5))−5820sin⁥(754π(64x−5))−560455cos⁥(19π(7−32x))5202688++560455sin⁥(118π(64x+5))+3077550sin⁥(154π(64x+5))+90069sin⁥(554π(64x+5))+5820sin⁥(754π(64x+5))5202688−1132<x≀11320|x|>12



Eine noch signifikantere Verringerung des Niveaus der Nebenkeulen kann erreicht werden, indem die Fourier-Transformation quadriert wird und dadurch das Niveau der Nebenkeulen gleichzeitig um den Faktor 2 verringert wird. Dies ermöglicht es Ihnen, die Zunahme der Anzahl von Parametern fĂŒr ihre manuelle Auswahl zu beseitigen, erhöht jedoch die KomplexitĂ€t bei der Berechnung der Faltung im Zeitbereich.



der Code
hx3 = Function[{x, a}, 
  Convolve[hx1[x, a], hx1[x, a], x, y] /. y -> 2 x
 // FullSimplify // Evaluate]


↓






und hier ist es bereits möglich, eine UnterdrĂŒckung ĂŒber 160 dB zu erreichen:







Wir werden die Formel wegen ihrer beeindruckenden GrĂ¶ĂŸe nicht explizit angeben.



Hypergeometrische Fensterfunktionen



Um die erforderliche Anzahl von Nullen an den Grenzen unserer Funktion sicherzustellen, haben wir die Lösung eines Gleichungssystems mit anschließender Integration durchsucht. Dies ist nicht sehr praktisch - Sie mĂŒssen die Anzahl der Gleichungen jedes Mal Ă€ndern. Vielleicht gibt es eine einfachere und schönere Lösung? Es gibt! Und die hypergeometrische Funktion hilft uns dabei.



kurz ĂŒber hypergeometrische Funktionen
, . — , . — .



Unsere Lösung sieht folgendermaßen aus:

2zΓ(n+32)2F1(12,−n2;32;z2)πΓ(n2+1)+a(z+bz3)(1−z2)n/2

Wo z=sin⁥(πx2)



Es besteht aus der Summe zweier Teile: dem Antiderivativ der Funktion (1−z2)n2, in der Amplitude auf den Punkt (1,1) normiert und eine Funktion mit freien Parametern, multipliziert mit derselben (1−z2)n2Um die erforderliche Anzahl von Nullableitungen beizubehalten: Die







Genauigkeit der Anpassung und ihr Einfluss auf die Verteilung der Nebenkeulen hÀngt davon ab, welche Funktion wir zur Korrektur der Form wÀhlen. Es gibt mögliche Optionen, die separate Studien erfordern. In diesem Fall die Funktiona(z+bz3)bietet eine völlig akzeptable Option - und aufgrund von zwei Parametern können Sie genauere Einstellungen vornehmen.



Die Formel selbst ist insofern interessant (und praktisch), als sie fĂŒr gerade n zu einem Polynom und fĂŒr ungerade n zu der Summe eines Polynoms mit Arkussinus und Quadratwurzel vereinfacht wird - was die endgĂŒltige Formel kompakter und einfacher zu berechnen macht.



Es ist bereits einfacher (und schneller), die Parameter hier durch die diskrete Fourier-Transformation auszuwĂ€hlen. Wir benötigen außerdem eine zusĂ€tzliche Definition der Überlappungsfunktion, um mit drei Parametern arbeiten zu können:



















Als Beispiel wird unsere Funktion nach dem Ersetzen der Parameter aus dem Bild vereinfacht



der Code


↓

−288z11+2315z9−7380z7+12330z5−11940z3+8163z3200





Inverses Kaiserfenster



Wenn sich die Aufgabe, die Fenster zu einem zusammenzufassen, nicht lohnt, ist das Kaiser-Fenster das optimalste Fenster, mit dem Sie die Breite der Hauptkeule reibungslos anpassen können. Es hat jedoch einen Nachteil - da es in Form der Bessel-Funktion ausgedrĂŒckt wird , ist es etwas schwierig, es außerhalb der mathematischen Pakete zu lesen. Sie können die Bessel-Funktion natĂŒrlich separat implementieren - oder Sie können nach einer AnnĂ€herung durch Elementarfunktionen suchen. Und plötzlich stellte sich heraus, dass man mit der Funktion des zeitlich begrenzten Spektrums des Kaiser-Fensters ein noch etwas besseres Ergebnis erzielen kann -



sinh⁡(k1−4x2)sinh⁡(k)1−4x2Π(x)

Hinweis
±12 , ksinh⁥(k).


Die Bezahlung fĂŒr eine solche listige Entscheidung war die Unmöglichkeit, ihr Spektrum rein analytisch auszudrĂŒcken - aber das ist nicht so wichtig, weil wir in der Praxis auf jeden Fall Daten in diskreter Form mit der diskreten Fourier-Transformation betreiben und analysieren. Unten in der Grafik können Sie ihre Spektren vergleichen, wobei Rot das ursprĂŒngliche Kaiser-Fenster und GrĂŒn die AnnĂ€herung ist:



der Code


↓






Bei gleicher Breite des Hauptblatts ist die Höhe der Nebenlappen etwas geringer. Zur Vereinfachung der Verwendung können Sie eine Tabelle mit ungefĂ€hren Werten des Parameters k erstellen , um das erforderliche Maß an NebenkeulenunterdrĂŒckung zu erhalten:

-60 k=8.8-90 k=11.36-120 k=15.18-150 k=18.88



Das Finden einer AnnĂ€herung an das Antiderivativ des inversen Kaiserfensters bleibt ein separates interessantes Problem. Bisher war es nur möglich, es durch eine Potenzreihe auszudrĂŒcken, die ziemlich langsam konvergiert:



∫sinh⁥(k1−4x2)sinh⁥(k)1−4x2dx=∑n=1∞−212−nkn−1x2n−1(−k(−1)nKn−12(−k)+kKn−12(k))π(2n−1)sinh⁥(k)Γ(n)



Vielleicht können Experten in Mathematik in den Kommentaren eine bessere Lösung vorschlagen.



Fazit



Trotz der Tatsache, dass die digitale Signalverarbeitung eine vollstĂ€ndig ausgebildete Disziplin ist, gibt es noch Raum fĂŒr Entwicklung und etwas Neues darin - zumindest in der vorhandenen speziellen und wissenschaftlichen Literatur werden die Fragen der Konstruktion von Fensterfunktionen, die zu einer Einheit zusammengefasst werden, nicht berĂŒcksichtigt. und die FĂ€higkeiten moderner Computeralgebrasysteme ermöglichen es, das gesammelte Wissen auf einem qualitativ neuen Niveau zu ĂŒberdenken.



Das Originaldokument von Wolfram Mathematica mit allen Berechnungen ist auf GitHub verfĂŒgbar .



All Articles