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:
- 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 ...
- 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 ...
- 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:
- Keine LĂŒcken an den Kanten - Werte gleich Null. Die Pausen sind von Dirichlet, Hamming, Blackman-Harris. Nicht haben - Dreieckig, Hann, Nuttal
- Fehlen von DiskontinuitÀten des 1. und anderer Derivate
Zwei weitere Fensterfunktionen sind separat hervorzuheben:
- Kaiser, mit dem Sie die Breite des Hauptblatts einstellen können;
- 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
â
NuttallWindow[x] // FunctionExpand
â
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}]
â
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 Dezibelerhalten 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
â
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]
â
und nach Integration mit den Parametern a = 0,6628 und einem Ăberlappungspegel von 4,5 erhalten Sie eine DĂ€mpfung von -90 dB:
Explizit:
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]
â
und nach Integration mit den Parametern a = 0,5862 und dem Ăberlappungspegel von 6,4 erhalten Sie eine UnterdrĂŒckung von -110 dB:
Explizit:
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:
Wo
Es besteht aus der Summe zweier Teile: dem Antiderivativ der Funktion , in der Amplitude auf den Punkt (1,1) normiert und eine Funktion mit freien Parametern, multipliziert mit derselben Um 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 Funktionbietet 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
â
â
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 -
Hinweis
, .
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:
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:
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 .