Forum: Digitale Signalverarbeitung / DSP / Machine Learning Kaiser-Window Annäherung


von Peter (Gast)


Lesenswert?

Ich suche eine einfach parametrische Annäherung an Kaiser 5 / 7 die man 
in einem AVR skalieren kann. Längen im Bereich von 100 ... 1000 Punkten. 
Leider gibt es solche Fälle wie 777 Punkte, sodass ich nicht einfach 
eine Tabelle nehmen und nicht benötigte Punkte weglassen kann.

Ich habe Wiki, DSP und andere Seiten gescanned und da hier gefunden:

I0(x)≈1+x2(−1(1!)241+x2(+1(2!)242+x2(...+x2((−1)K−1((K−1)!)24K−1+x2(−1)K 
(K!)24K))))

kennt jemand was Einfacheres?

von Tilo R. (joey5337) Benutzerseite


Lesenswert?

Bitte versuch' erst mal, dein Problem verständlich zu schildern.
Den ganzen Kontext, den du im Kopf hast, können wir nicht raten.

Googeln nach Kaiser 5/7 liefert Fußballschuhe.

Ich habe zwar eine Glaskugel mit USB-Anschluss, die ist aber im Büro und 
da komme ich erst wieder am Dienstag ran.

von Frank G. (frank_g53)


Lesenswert?


von W.S. (Gast)


Lesenswert?

Peter schrieb:
> Ich suche

Ver_suche es mal damit (sinngemäß):
1
// polynomial approximation of the zeroth order
2
// modified Bessel function
3
// from the Numerical Recipes in C p. 237
4
5
function Bessel0 (x : double): double;
6
var
7
  ax, ans : double;
8
  y       : double;
9
begin
10
  ax:= abs(x);
11
  if ax < 3.75
12
  then
13
  begin
14
   y:= x / 3.75;
15
   y:= y * y;
16
   ans:= 1.0 +
17
         y * (3.5156229 +
18
         y * (3.0899424 +
19
         y * (1.2067492  +
20
         y * (0.2659732 +
21
         y * (0.360768e-1 +
22
         y * 0.45813e-2)))));
23
  end
24
  else
25
  begin
26
   y:= 3.75 / ax;
27
   ans:= (exp(ax) / sqrt(ax)) * (0.39894228 +
28
          y * (0.1328592e-1 +
29
          y * (0.225319e-2  +
30
          y * (-0.157565e-2 +
31
          y * (0.916281e-2  +
32
          y * (-0.2057706e-1+
33
          y * (0.2635537e-1 +
34
          y * (-0.1647633e-1+
35
          y * 0.392377e-2))))))));
36
  end;
37
  result:= ans;
38
end;
39
40
// Kaiser-Fenster
41
function Kaiser (i: integer; beta: double): double;
42
var
43
  a, q : double;
44
  arg  :double;
45
begin
46
  a:= FilterTapnum / 2.0;
47
  q:= (i-a) / a;
48
  q:= q * q;
49
  arg:= beta * sqrt(1.000 - q);
50
  result:= Bessel0(arg);
51
end;

W.S.

von W.S. (Gast)


Lesenswert?

nochwas:
Ob du bei deinem AVR mit single auskommst, muß du mal selber ausrechnen.

W.S.

von Hilbert (Gast)


Lesenswert?

Deinen Beitrag verstehe ich nicht.

Ich habe aber mal ein Energiemessgerät gebaut, wo ein Kaiser-Fenster für 
eine Hilbert-Transformation verwendet wurde.
Möglicherweise meinst du ja das.

Hier steht beschrieben, wie es geht:
https://www.nxp.com/docs/en/application-note/AN4265.pdf

Man kann damit die Koeffizienten berechnen lassen:
http://www.iowahills.com/A5HilbertPhasePage.html

Kapitel 3.5.
Das wird da als FIR-Filter umgesetzt.

Läuft bei mir auf einem PIC32, aber ich sehe keinen Grund, warum das 
nicht auch ein AVR könnte.

von W.S. (Gast)


Lesenswert?

Hilbert schrieb:
> Deinen Beitrag verstehe ich nicht....
> Läuft bei mir auf einem PIC32, aber ich sehe keinen Grund, warum das
> nicht auch ein AVR könnte.

Und was verstehst du da nicht? Ist ein Kaiser-Window eben. Tapnummer 
rein, Beta rein, Koeffizient raus. ferticht. Hab's eben grad mal aus 
einem Filter-Simulations-Programm von mir rausgeschnitten, deswegen das 
"sinngemäß".

Ich sehe aber durchaus einen Grund beim AVR, weil dort double gleich 
single ist... es sei denn, der TO benutzt einen Compiler, der 
tatsächlich double macht. Aber das kann ich in diesem Forum nicht als 
gesetzt ansehen.

W.S.

von Hilbert (Gast)


Lesenswert?

W.S. schrieb:
> Und was verstehst du da nicht?

Ich habe mich nicht auf deinen Beitrag bezogen, sondern den des TE.

von Peter (Gast)


Lesenswert?

Hilbert schrieb:
> Deinen Beitrag verstehe ich nicht.
Das Fenster ist vorgegeben und soll verwendet werden. Kann sein, dass es 
anders geht, nutzt mir aber nichts. Ich muss es anpassen an die Zahl der 
Daten. Laut heute 333, 666, 999 und 1023, 511, 255 sowie 99,199,299.

Es sind praktisch immer 1 weniger als normale Zahlen.


W.S. schrieb:
> nochwas:
> Ob du bei deinem AVR mit single auskommst, muß du mal selber ausrechnen.
>
> W.S.
Dein Beispiel sieht schon mal recht vielversprechend aus. Jedenfalls 
meine ich dass man das implementieren könnte. Ich checke es mal wegen 
der Auflösung. Irgendwie kriege ich das schon hin. Die Datenrate ist ja 
langsam genügend.

von W.S. (Gast)


Lesenswert?

Peter schrieb:
> 666

Mach deine Filterlänge am besten immer ungerade, damit du genau 1 Tap 
exakt in der Mitte hast. Bei gerader Tapanzahl ist die Mitte, also quasi 
das Jetztzeit-Sample genau zwischen deinen beiden mittleren Samples - 
und das ist oftmals doof.

W.S.

von J. S. (engineer) Benutzerseite


Angehängte Dateien:

Lesenswert?

Peter schrieb:
> sodass ich nicht einfach
> eine Tabelle nehmen und nicht benötigte Punkte weglassen kann.
Was wäre, die Punkte einfach zu interpolieren? Meistens bemüht man doch 
bei solchen Anwendungen nicht den Prozessor mit einer so aufwändigen 
Berechnung, sondern nutzt den heute in Massen vorhandenen Speicher und 
macht das offline. Es läuft doch eh auf eine ungenaue Abbildung durch 
Annäherung hinaus.

Da fände ich eine Tabelle mit quadratischer Interpolation besser. Damit 
wären auch unterschiedliche Kaiser-Fenster gleich miterschlagen. Selbst 
bei einer linearen Interpolation mit 37 aus 64 Punkten und einer 
Phasenauflösung von nur 8 Bit! bekommt man bei einem von-Hann-Fenster 
nur 3% maximalen relativen- und 0,005 absoluten Fehler. Siehe Bild aus 
meinem Fundus. (absoluter Fehler orange x 100, relativer Fehler rot in 
Prozent).

Da die Fenster in der Regel für sequenziell eintrudelnde Daten benötigt 
werden, man könnte die Werte auch noch mit einem sehr einfachen 
FIR-Filter glätten, um Interpoliertes abzurunden.

W.S. schrieb:
> das Jetztzeit-Sample genau zwischen deinen beiden mittleren Samples
Das ließe sich auch mit den Koeffizienten korrigieren, wenn nötig, oder 
man füllt eine Null, wenn es die Anwendung erlaubt, ich glaube aber, 
dass es bei der Anwendung nicht so sehr darauf ankommt. Allerdings ist 
die 666 ja die einzige gerade Zahl in dem Verein und damit 
hinterfragenswert. Sicher kann man auch 667 nehmen. Bibeltreue 
Entwickler werden sich ohnehin weigern, ausgerechnet die zu 
implementieren.

Ich würde auch noch die Frage einwerfen, woher die Koeffizienten kommen? 
Sollen die auch online berechnet werden? Das scheint mir gfs noch 
aufwändiger, sofern es nicht einfach ein Tiefpass ist.

von W.S. (Gast)


Lesenswert?

Jürgen S. schrieb:
> Ich würde auch noch die Frage einwerfen, woher die Koeffizienten kommen?

Na aus ner Berechnung zur Laufzeit. Das hängt doch davon ab, was der 
Benutzer grad an den Knöpfen des Gerätes dreht.

Also, deine Idee, die Fensterfunktion per Interpolation zu machen, ist 
alles andere als gut. Immerhin sind die geläufigen Fensterfunktionen 
(Blackman, Kaiser) ja kein Hexenwerk und lassen sich zur Laufzeit 
berechnen. Das ist nötig, wenn man es mit unterschiedlich großen 
Filterkerneln zu tun hat. Ist hingegen die Länge des Filterkernels 
konstant, dann kann man auch die Fenster als konstantes Array vorhalten.

Jürgen S. schrieb:
>> das Jetztzeit-Sample genau zwischen deinen beiden mittleren Samples
> Das ließe sich auch mit den Koeffizienten korrigieren

Nein, das ist prinzipiell nicht möglich. Bei gerader Tapanzahl sitzt man 
prinzipbedingt immer exakt mitten zwischen den Stühlen.

W.S.

von J. S. (engineer) Benutzerseite


Lesenswert?

W.S. schrieb:
> Also, deine Idee, die Fensterfunktion per Interpolation zu machen, ist
> alles andere als gut.
Kann aber genauestens untersucht und simuliert werden. :-)

> Immerhin sind die geläufigen Fensterfunktionen
> (Blackman, Kaiser) ja kein Hexenwerk und lassen sich zur Laufzeit
> berechnen.
Das kommt drauf an! Blackman-Harris erfordert in einer Version gleich 3 
Cosinus-Funktionen/Frequenzen und die werden letztlich immer auch über 
Tabellen ermittelt und/oder brechen nach Iterationen ab. Das bringt also 
potenziell mehr Fehler oder erfordert mehr Auflösung bei der Berechnung 
und damit Aufwand. Da ist die einzelne Tabelle mit den Endwerten 
genauer, kontrollierbarer und vor allem schneller. Sie ist halt leider 
erheblich größer.

> Das ist nötig, wenn man es mit unterschiedlich großen
> Filterkerneln zu tun hat. Ist hingegen die Länge des Filterkernels
> konstant, dann kann man auch die Fenster als konstantes Array vorhalten.
Ganz genau daher ja der Tabellenvorschlag. Nur wenn kein Platz für 
Tabellen ist, behilft man sich mit einer generischen Synthese.

Allerdings geht das bei Tempoanwendungen kaum, das in Echtzeit zu 
berechnen - besonders nicht, wenn sich der Filter rasch ändern muss. Das 
ist bei Radar z.B. der Fall, wenn die Datenrate im Bereich der 
FPGA-Taktfrequenz ist. Selbst bei Audio-Apps ist das schon kritisch: 
Meine Window- und Filterparameter für die Equalizer, kann Ich für 192kHz 
und entsprechender TAP-Zahl noch in ausreichender Geschwindigkeit 
nachberechnen, wenn "jemand an den Knöpfen dreht" und damit ein analoges 
Verhalten herstellen. Beim Ultraschall ging es schon nicht mehr.

Bei der hiesigen Anwendung ist die Datenrate sicher gering, aber die 
Prozessorpower auch niedrig. Daher sehe ich das ähnlich gelagert.

Daher wäre die Frage, ob man mit mehreren Tabellen nicht besser 
hinkommt, zumal die Anzahl ja bekannt ist.

Aber auch selbst dann, wenn nur eine statische Tabelle implementiert 
werden kann, lässt es sich mit Interpolation in der Regel recht gut 
hinbiegen.

Man darf nicht vergessen, dass das Berechnen der Koeffizienten und 
Fensterwerte auch an Auflösungsgrenzen stößt und man sich dort Fehler 
einheimst. Die Wirkung der Fehler einer Interpolation zweier ansonsten 
exakter Tabellenwerte liegen hingegen mit etwas Geschick vom Spektrum 
weit oberhalb der Grenzfrequenz des Filters, um das es geht. Das ist 
recht gut untersuch- und kontrollierbar.

Ich habe mich da auch schon verschätzt! Ich habe generische Synthesen in 
VHDL für die meisten Fenster - unter anderem auf Basis meines 
10Bit-Sinus (siehe Digitale Sinusfunktion) und komme da für 
mittelanspruchsvolle Anwendungen auch sehr gut hin. Deutlich kleiner, 
als z.B. CORDIC bei gleicher Genauigkeit!  Das Fehlersprektrum hat aber 
durch das digitale Rauschen etliche tieffrequente Komponenten. Bei den 
Implementierungen und Rechentiefen, die in FPGAs mit ihren MUL-Breiten 
gerade so richtig effektiv sind, werden die mitunter irgendwann 
relevant. Für hohe Anforderungen machen die Tabellen mit Interpolation 
weniger Aufwand - bei besseren Ergebnissen. Um da drüber zu kommen, muss 
man sehr genau rechnen. Das wird langsam und in FPGAs z.B. sehr groß.


Wo es sich eher lohnt, sind CPU mit 64 Bit und ihren Rechenoptionen.

von W.S. (Gast)


Angehängte Dateien:

Lesenswert?

Jürgen S. schrieb:
> Kann aber genauestens untersucht und simuliert werden. :-)

Mag ja sein, aber ich weiß, daß schon Kleinigkeiten bei der 
Tap-Berechnung und bei der Fensterfunktion ne Menge bewirken im 
Sperrbereich des Filters.

Naja - und Winkelfunktionen brauchst du bei der Berechnung der Taps ja 
ohnehin - bei sin(x)/x wenigstens einmal den Sinus. Bei Blackman kommt 
dazu noch 2x Cosinus und bei Kaiser eben ne Wurzel und ein Sack voll 
Multiplikationen. Wenn man das per SW in double machen will, wird's 
natürlich nicht furchtbar schnell, wenn dafür jedoch single ausreichen 
sollte, dann geht's beim Cortex M4F ratzfatz.

Und was hast du gegen den Cordic? Die meisten Leute glauben, man müßte 
den mit voller Stellenzahl abarbeiten, aber das stimmt einfach nicht. 
Wenn man den Rest mit dem bislang aufgelaufenen 1/cos(dphi) verrechnet, 
dann braucht man überschlägig nur 1/3 der Bits und der Rest kommt aus 
dem Rest. Nochmal: für 15 Bit braucht man nur 5 Iterationen, für 24 Bit 
braucht man nur 8 Iterationen.

Ich häng hier mal ein kleines Delphi-Programm dran. Ich hatte es den 
Cordic sowohl mit double als auch mit single rechnen lassen, die 
tabellarischen Ergebnisse sind anbei im ZIP. Wundere dich nicht, ich 
hatte mir erspart, ne Tabelle für die arctan's zu schreiben. Für eine 
echte Implementierung würde man das natürlich tun.

W.S.

von Peter (Gast)


Lesenswert?

Jürgen S. schrieb:
> die 666 ja die einzige gerade Zahl in dem Verein und damit
> hinterfragenswert. Sicher kann man auch 667 nehmen. Bibeltreue
> Entwickler werden sich ohnehin weigern, ausgerechnet die zu
> implementieren.
In welcher "Bibel" steht, dass man die nicht nehmen soll? Was ist an den 
geraden Zahlen so schlecht? Die Filtersumme ändert sich nur minimal, 
wenn ein Wert mehr gerechnet wird, meine ich. Trotzdem möchte ich nicht 
ohne zwingenden Grund einen weiterer Wert mitverrechnen. Leider gibt es 
auch noch die 222.

> Ich würde auch noch die Frage einwerfen, woher die Koeffizienten kommen?
Diese kommen aus einer Entwicklungsformel, die ich nicht mehr 
programmieren muss, weil es die schon gibt. Die ist etwas kompliziert 
und nicht ganz durchschaubar.

W.S. schrieb:
> bei Kaiser eben ne Wurzel und ein Sack voll
> Multiplikationen.
Ich habe das weiter oben angesprochene Beispiel eingebaut, komme aber 
auf kein Kaiserfenster. Es sieht in keinem Fall so aus, wie in der 
Wikipedia.

Wie könnte ich das bitte mit einem Cordic berechnen?

von W.S. (Gast)



Lesenswert?

Peter schrieb:
> Ich habe das weiter oben angesprochene Beispiel eingebaut, komme aber
> auf kein Kaiserfenster. Es sieht in keinem Fall so aus, wie in der
> Wikipedia.

Dann hast du irgend einen Fehler gemacht.
Ich häng dir mal zwei Beispiele dran, sind im Prinzip SSB-Filter, also 
für Quasselfunk so etwa 0.2 .. knapp 3 kHz bei 44.1 kHz Samplerate.

Ein Filter mit dem üblichen Blackman gemacht, das andere mit dem oben 
geposteten Kaiser, Beta zu 9.5 gewählt.

Ich hab übrigens die Sinusberechnung für das sin(x)/x Filter auch mal 
per single und obendrein auch mit dem Pedersen gemacht. Resultat: man 
kann beides benutzen, die Unterschiede zeigen sich im Sperrbereich und 
sie sind m.E. durchaus tragbar.

Ich habe anschließend auch noch mal den Vergleich gemacht zwischen dem 
Filter in double, single und integer mit verschiedenen Bitbreiten 
gerechnet. Nur 16 Bit ist zu wenig, aber so ab 20 Bit integer ist das 
OK.

Also guck mal, was du da falsch gemacht hast.

W.S.

von J. S. (engineer) Benutzerseite



Lesenswert?

W.S. schrieb:
> Und was hast du gegen den Cordic?
Im Grunde nichts, nur arbeitet der eben auch mit intern vorgerechneten 
Tabellenwerten und die müssen eine gewisse Genauigkeit haben, damit 
Fehler nicht akkumulieren. Eine finale Tabelle gleicher Auflösung der 
Einzelwerte hat immer weniger Fehler. Man muss also schauen, was man 
vergleicht. Klar, der CORDIC kommt mit vielleicht 10 Real-Werten aus und 
ist super klein.

Da es hier aber um das Rechnen mit einem Kleinstprozessor geht, fände 
ich es allemal sinnvoller, sich für die paar Fälle einige Tabellen zu 
machen und deren Werte zu laden. Ein einzelner Speicherzugriff, statt 
einem Vielfachen davon. Bei einer Interpolation wären es zwei Zugriffe 
und etwas Addition. Blackman-Harris mit 3 Termen und die Koeffizienten 
sind 4x cosinus-Cordic, mehr Adds und Muls. Das ist Arbeit, die man in 
die Designzeit schieben kann.

Ich halte jetzt mal mit einer 1024 Punktetabelle gegen, aus der man mit 
einfacher Interpolation 7777 Punkte rausholt:

Fehler orange x 10.000, relativer Fehler rot in Promille -> maximal 
100...200ppm.
Die Werte sind in maximal 16 bit gerechnet.

Für andere Funktionen hängt der Fehler von der maximalen Steilheit ab. 
Diese ist aber bei engeren Fenstern, als das von-Hann in der Mitte 
größer, wo der relative Fehler klein ist. Damit wird sich das kaum 
verschlechtern - im Gegenteil.

von J. S. (engineer) Benutzerseite


Lesenswert?

W.S. schrieb:
> aber ich weiß, daß schon Kleinigkeiten bei der
> Tap-Berechnung und bei der Fensterfunktion ne Menge bewirken im
> Sperrbereich des Filters.
Genau so ist es und damit müssen die Faktoren des Fensters effektiv 
mindestens so genau sein, wie die Koeffizienten. Wenn man sich nun die 
Blackman-Fenster und ihre Derivate ansieht, dass die Faktoren auf 6 
Stellen genau gegeben sind, dann muss man nachdenken, ob man mit single 
auskommt.

Bei Kaiser ist das noch viel schlechter. Da möchte man keine 
Besselfunktionen in Echtzeit berechnen. Diese sind am Ende auch nur über 
Tabellen und Polynome genähert. Damit schleppt sich ein Fehler zum 
nächsten, bis hin zu einem Wertesystem, bei dem einige Werte recht genau 
sind und andere nicht. Das ergibt keinen tabellenweit konsistenten 
Fehler. Man muss dann die Rechnung weitgehend auf den ärgsten Fehler 
abstimmen, womit dann die meisten anderen Werte viel zu genau sind und 
erheblichen Aufwand machen.

Zudem erzeugt das ein "zufälliges" Fehlerspektrum und damit Rauschen, 
welches der Rechnung aufgedrückt wird. Wie ich schon ausgeführt habe, 
ist das bei Interpolationen besser kontrollierbar, wenn man die 
interpolierten Werte selbst entsprechend filtert, also "rund" 
interpoliert. Ein kleines Biquad-filter reduziert schon mal alles 
oberhalb der 2. Oberwelle und die überbleibenden Spektralanteile kleben 
dann im Filter selber.

Bei so umständlichen Funktionen wie Kaiser rechnet man das fein 
säuberlich in eine Tabelle und nimmt die Koeffizienten gleich mit 
hinein. Was an Rechenzeit im Prozzi zur Verfügung steht, steckt man dann 
in die Filterung. Die maximale Krümmung der Koeffizienten/Fensterwerte 
ist ja dediziert bekannt und kann somit als Information bez. der 
Grenzfrequenz in den Interpolationsfilter einfließen.

Dann baut man einfach eine Tabelle mit einem Fehler im Bereich der 
Hälfte des Zulässigen und interpoliert sich den Rest hin. Selbst bei so 
ungünstigen Konstellationen wie 1023/1024 gibt es dann kaum Fehler, 
obwohl die Schwebungsfrequenz extrem tief liegt.

von J. S. (engineer) Benutzerseite


Lesenswert?

Peter schrieb:
> Jürgen S. schrieb:
>> die 666 ja die einzige gerade Zahl in dem Verein und damit
>> hinterfragenswert. Sicher kann man auch 667 nehmen. Bibeltreue
>> Entwickler werden sich ohnehin weigern, ausgerechnet die zu
>> implementieren.
> In welcher "Bibel" steht, dass man die nicht nehmen soll?
In der Offenbarung des Johannes. Oder wie es die Eisernen Jungfrauen 
einst ausdrückten:

Woe to you, oh earth and sea, for the devil sends the beast with wrath,
because he knows the time is short. Let him who hath understanding 
reckon the number of the beast, for it is a human number, it's number is 
666!

Es gibt in der Tat unzählige, die diese Zahl meiden. Glaubt man gar 
nicht.

Ungeachtet dessen kommen mir Deine Filter-TAP-Zahlen etwas suspekt vor. 
Woher kommen die?

> Was ist an den geraden Zahlen so schlecht?
Die Filtermitte sitzt nicht auf einem echten Sample. Das ist aber nicht 
unbedingt ein Problem:


> Jürgen S. schrieb:
>>> das Jetztzeit-Sample genau zwischen deinen beiden mittleren Samples
>> Das ließe sich auch mit den Koeffizienten korrigieren
>
> Nein, das ist prinzipiell nicht möglich. Bei gerader Tapanzahl sitzt man
> prinzipbedingt immer exakt mitten zwischen den Stühlen.

Aus Sicht des Samples und seinem Zeitpunkt nicht, aber man kann die 
Filterkoeffizienten versetzen, wie beim statischen 
Sub-Sample-Prozessing.
Damit kann man die Wirkung des Filters um 0,5 Samples verschieben.
Das ist nicht dasselbe, hat aber im Bezug auf die Vergleichbarkeit 
zweier Filter, die einmal mit gerade und einmal mit ungerade arbeiten, 
dieselbe Wirkung.

von Peter (Gast)


Lesenswert?

Jürgen S. schrieb:
> Da es hier aber um das Rechnen mit einem Kleinstprozessor geht, fände
> ich es allemal sinnvoller, sich für die paar Fälle einige Tabellen zu
> machen und deren Werte zu laden.
Mit dem RAM sieht es leider nicht so üppig aus. Es muss doch möglich 
sein, das zu berechnen: Kaiser habe ich von Wikipedia. Das müsste 
stimmen. Das Problem ist jetzt die Besselfunktion. Ich beziehe mich auf 
die folgende Seite auf der die "Besselfunktion null-ter-Ordnung" 
bestimmt werden kann:

https://mhf-e-wiki.desy.de/Bessel-Funktion

Die Formel lautet wie angegeben.

Meines Erachtens steht unten 2x m-Fakultät, da "n" = 0. Der Zähler 
liefert ein wechselndes 1/-1 und der Faktor hinten sind m/2 hoch (2m). 
Die Tabellenwerte summieren die Werte über m auf. Müsste machbar sein, 
da sie schnell konvergieren. Ich habe es für die angegebene Nullstelle 
bei 2,405 durchprobiert, stimmt aber nicht. Wo ist der Fehler?

W.S. schrieb:
> Ich häng dir mal zwei Beispiele dran, sind im Prinzip SSB-Filter
Mit welcher Software sind die Funktionen erzeugt worden?

von W.S. (Gast)


Lesenswert?

Peter schrieb:
> Mit welcher Software sind die Funktionen erzeugt worden?

Mit meinem eigenen Entwurfs-System. Und eben mit dem bereits von mir 
geposteten Kaiser-Fenster, inclusive der Bessel0.

W.S.

von Dergute W. (derguteweka)


Lesenswert?

Moin,

Warum beschleicht mich ganz stark das Gefuehl, dass das mit dem 
Kaiserwindow mal wieder so ein Holzweg ist, der - einmal beschritten - 
um's Verrecken alternativlos ausgelatscht werden muss? Koste es was es 
wolle.

Kein Mensch kann was mit einem alleine in der Weltgeschichte 
rumstehenden Kaiserwindow anfangen. Das ist hoechstens Teil einer z.B. 
filternden Signalverarbeitung. Die aber sicher eigentlich durch ganz 
andere Anforderungen gekennzeichnet ist (.z.b. Durchlassripple, 
Sperrdaempfung, Gruppenlaufzeit, Datendurchsatz, ...) und daher sicher 
auch irgendwie anders aufgebaut werden kann. Und da eine alleine in der 
Weltgeschichte rumstehende Signalverarbeitung auch recht sinnlos ist, 
koennte man auch da 2..3 Worte verlieren...
Aber nein; es muss das Fenster vom Herrn Kaiser von der 
Humbug-Muelleimer sein. Mit Besselfunktionen. Aufm AVR. In 
floating-point.
Wo ich - wenns einer still implementiert haette und hier vorstellen 
wuerde - sofort begeistert waere. Aber wenn man's nicht hinkriegt, muss 
man sich halt schon auch mit der Frage plagen lassen, wie sinnvoll so 
ein Unterfangen wohl sein mag.

Gruss
WK

von W.S. (Gast)


Lesenswert?

Dergute W. schrieb:
> Warum beschleicht mich ganz stark das Gefuehl,..

Ja, das kenne ich. Immerhin war es der dedizierte Wunsch des TO, den 
Algorithmus für eine derartige Fensterfunktion mal gesagt zu bekommen, 
was ja auch wunschgemäß erfolgte - bittesehr.

Offenbar hat er den geposteten Code nicht wirklich verstanden. 
Jedenfalls meint er, "Ich habe das weiter oben angesprochene Beispiel 
eingebaut, komme aber auf kein Kaiserfenster. Es sieht in keinem Fall so 
aus, wie in der
Wikipedia".

Ob dabei ein sinnvolles Projekt im Hintergrund steht oder eher nicht, 
ist ne andere Sache. Er will vermutlich ein variables FIR-Filter mit 
"Längen im Bereich von 100 ... 1000 Punkten" auf nem AVR damit 
berechnen. Nun ja, seufz.

Putzig ist dabei, daß der Vergleich zwischen einem Bandpass mit Kaiser 
versus Blackman offenbar niemanden interessiert, Downloads=0. Die 
ungepackt geposteten Bilder, wo ich mal mit reduzierten Bitbreiten 
gerechnet habe, um mir die Degradation zu veranschaulichen, scheinen auf 
größeres Interesse zu treffen. Sehen so schön bunt aus...

Vielleicht ist es dem TO auch nur ein Anliegen, derartige Berechnungen 
überhaupt auf einer eigenen HW tun zu können, also den eigentlichen 
Algorithmus zu kennen. Da wäre der AVR lediglich als symbolische Geste 
zu verstehen.

Immerhin wäre es ansonsten recht wahrscheinlich, daß er mit Beiträgen 
zugemüllt würde, wo man ihm sagt, er soll doch einfach sich nen fertigen 
Filterkernel per Mathlab berechnen lassen. Viele Leute schweben auf 
derartiger Ebene und präsentieren angebliche Lösungen für ein Problem 
durch einen Verweis auf eine dafür spezialisierte Funktion in Mathlab. 
Sowas nützt normalerweise garnichts für's Verstehen und Können.

W.S.

von Peter (Gast)


Lesenswert?

Dergute W. schrieb:
> Warum beschleicht mich ganz stark das Gefuehl, dass das mit dem
> Kaiserwindow mal wieder so ein Holzweg ist, der - einmal beschritten -
> um's Verrecken alternativlos ausgelatscht werden muss? Koste es was es
> wolle.
Es muss laut SPEC eingebaut werden. Ist nichts zu deuten. Die Herren 
Physiker haben es so festgelegt. Ich werde Deine Kritik weitergeben.

W.S. schrieb:
> Viele Leute schweben auf
> derartiger Ebene und präsentieren angebliche Lösungen für ein Problem
> durch einen Verweis auf eine dafür spezialisierte Funktion in Mathlab.
> Sowas nützt normalerweise garnichts für's Verstehen und Können.
MATLAB nicht Mathlab.

Ich konnte die Näherung nun ins Laufen bekommen. War ein Tippfehler in 
der Weitergabe der Parameter. Hat sich verrechnet. Das Fenster sieht nun 
aus, wie das in der Wikipedia.

von Dergute W. (derguteweka)


Lesenswert?

Moin,

Peter schrieb:
> Es muss laut SPEC eingebaut werden. Ist nichts zu deuten. Die Herren
> Physiker haben es so festgelegt. Ich werde Deine Kritik weitergeben.

Wuerd' mich schon interessieren, was letztendlich die Anforderungen 
sind, und warum's genau das olle Kaiserfenster sein muss. Vielleich 
hat's ja irgendeine tatsaechliche Berechtigung. Die faend' ich dann 
schon interessant.

Gruss
WK

von W.S. (Gast)


Lesenswert?

Peter schrieb:
> MATLAB nicht Mathlab.

Ist dir das derart wichtig? Mir nicht.

W.S.

von J. S. (engineer) Benutzerseite


Lesenswert?

Dergute W. schrieb:
> Wo ich - wenns einer still implementiert haette und hier vorstellen
> wuerde - sofort begeistert waere. Aber wenn man's nicht hinkriegt, muss
> man sich halt schon auch mit der Frage plagen lassen, wie sinnvoll so
> ein Unterfangen wohl sein mag.
Die Implementierung an sich ist eigentlich weniger das Problem. Man muss 
sich eben fragen, wann man die Iteration für die Besselfunktion 
abbricht. Für den Bogenabschnitt, der bei Kaiser relevant ist, reichen 
eigentlich 5-7 Iterationen wegen der doppelten Fakultät im Nenner. Es 
läuft also wieder auf eine Abschätzung hinaus, wie genau der jeweilige 
Wert sein muss. Ab dann muss man eben schauen, wie man es am 
Geschicktesten auflöst, um mit Integer hinzukommen. Man kann sowas ja 
als Rekursion hinschreiben, es in C++ mit einem Abbruchkriterium 
betreiben. In der selben Weise ginge das auch offline in einer Software 
wie Python oder Excel, indem man in jeder Rekursionsstufe eine 
Integerskalierung durchführt und die benötigten Korrekturfaktoren von 
der jeweils darunter liegenden Stufe ausrechnen lässt, es ausführen 
lassen, um so direkt die Skalierungsfaktoren mitgeliefert zu bekommen 
und sie auch gleich theoretisch zu testen. Für eine Logarithmusfunktion 
haben wir das mal in Unix gemacht.

W.S. schrieb:
> Putzig ist dabei, daß der Vergleich zwischen einem Bandpass mit Kaiser
> versus Blackman offenbar niemanden interessiert,
Vielleicht ist den regelmäßigen Nutzern von Fensterfunktionen deren 
Qualität und Unterschiede hinlänglich bekannt :-)

Peter schrieb:
> Es muss laut SPEC eingebaut werden. Ist nichts zu deuten. Die Herren
> Physiker haben es so festgelegt.
War da ein anderes Fenster drin (oder keins) und hat man gemerkt, dass 
da was nicht so ganz klappt?

> Das Fenster sieht nun aus, wie das in der Wikipedia.
Optisch geprüft oder über Wertevergleich? Oder sogar über 
Wirkungsvergleich zusammen mit dem Filter wie W.K. es oben skizziert?

Das, was das Fenster an Oberwellen betont und zu gut durchlässt, lässt 
sich teilweise mit den Filterkoeffizienten ausgleichen. Wenn es richtig 
billig und resourcenschonend sein soll, kann man dann auch so etwas 
nehmen und etwas korrigieren:
http://www.96khz.org/oldpages/windowfunctions.htm

Die Funktion in der zweiten Potenz kommt auf den benötigten Abschnitt 
der Besselfunktion bis auf 95% ran und mit einer Mischung aus S2 uznd S3 
kriegt man auch so etwas wie Kaiser einigermaßen hin.

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.