Ich starte nochmals einen Neuanfang mit meiner Fragestellung, weil die
ursprünglich angedachte Lösung, die hier diskutiert wird:
Beitrag "Funktion einer Analogschaltung zur kontinuierlichen Phasenverschiebung"
wohl nicht funktioniert. Ich beschreibe nochmals etwas genauer, was ich
brauche:
Ich bekomme digitale Daten von einem AD-Wandler, welche physikalische
Werte einer Mechanik darstellenund die in Echtzeit in ein Rechensystem
fließen sollen. Die Datenrate beträgt maximal 160kHz bei konstanter
Frequenz des Frontsystems (einstellbar). Ich kalkuliere damit mit 200kHz
mit je 16 Bit, Daten in signed integer von real -29.999 bis +29.999.
Der Datenstrom soll im Phasenverhalten beeinflusst werden und zwar so,
dass die tiefen Anteile unter etwa 24fps einstellbar um 0...2ms
verschoben
werden, während höhere immer weniger verschoben werden bis maximal 1ms.
Das Ganze soll einigermassen kontinuierlich sein. Die Grenzfrequenz wird
etwa 12kHz sein.
Die Laufzeitverzögerung ist nicht so wichtíg, es darf also durchaus ein
OFfset entstehen, wenn die Signalverarbeitung es erfordert. Aus eigenem
Wissen sehe ich da einen FIR-Filter, der bei 12Hz entsprechende Teile an
Perdioden betrachtet werden muss, was auf sagen wir 50ms hinaus laufen
könnte.
Wichtiger ist die relative Verzögerung für die Signale in den frames.
Ich bräuche folgende beide Extremfälle für die Einstellungen "minimal"
und "maximal", wenn man den OFfset für alle Werte mal ausser Acht lässt:
(Achtung: Der Kurvenverlauf ist anders, als im vorherigen thread, weil
ich einen Fehler drin hatte)
1
(min)(max)
2
0Hz:0,0ms2,0ms
3
10Hz:0,0ms2,0ms
4
20Hz:0,0ms2,0ms
5
-------------EckfrequenzUnten
6
40Hz:0,0ms1,9ms
7
80Hz:0,0ms1,8ms
8
160Hz:0,0ms1,7ms
9
320Hz:0,0ms1,6ms
10
680Hz:0,0ms1,5ms
11
1350Hz:0,0ms1,4ms
12
2700Hz:0,0ms1,3ms
13
5400Hz:0,0ms1,2ms
14
10800Hz:0,0ms1,1ms
15
----------------EckfrequenzOben
16
21000Hz:0,0ms1,0ms
17
30000Hz:0,0ms1,0ms
In Worten beschrieben, soll bei Hochdrehen des Parameters Delay von 0
... 100% die Verschiebung für tiefe Frequenzen von 0...1ms, und die für
hohe gleichförmig bis 2ms hochgehen.
Nun die Frage: Wie liesse sich diese Funktion mit einer digitalen
Schaltung MATLAB Code Software-Funktion beschreiben?
Es würde auch reichen, wenn der Verlauf über den gesamten Bereich
gleichmässig wäre, die Eckfrequenzen also in dem Sinn nicht existierten
und sich das Verhalten nach unten und oben fortsetzen würde.
Ich habe auf den im anderen Beitrag geantworteten Links und Seiten
gesucht, aber noch nichts Passendes auftreiben können.
Georg B. schrieb:> In Worten beschrieben, soll bei Hochdrehen des Parameters Delay von 0> ... 100% die Verschiebung für tiefe Frequenzen von 0...1ms, und die für> hohe gleichförmig bis 2ms hochgehen.
Du meinst vermutlich umgekehrt.
Als erstes kannst du mal ein Gesamtdelay abziehen, das auf alle
Frequenzen angewandt wird (1ms), dann wird es einfacher.
Als nächstes rechnest du mal die Delays in Phasenverschiebung um:
1
(min) (max) Phasenverschiebung β
2
10Hz : 0,0 ms 1,0 ms -> 3,6°
3
20Hz : 0,0 ms 1,0 ms -> 7,2°
4
40Hz : 0,0 ms 0,9 ms -> 13.0°
5
80Hz : 0,0 ms 0,8 ms -> 23,0°
6
160Hz : 0,0 ms 0,7 ms -> 40,3°
7
320Hz : 0,0 ms 0,6 ms -> 69,1°
8
680Hz : 0,0 ms 0,5 ms -> 122,4°
9
1350Hz : 0,0 ms 0,4 ms -> 194,4°
10
2700Hz : 0,0 ms 0,3 ms -> 291,6°
11
5400Hz : 0,0 ms 0,2 ms -> 388,8° <--- !!!!!
12
10800Hz : 0,0 ms 0,1 ms -> 388,8° <--- !!!!!
13
21000Hz : 0,0 ms 0,0 ms
14
30000Hz : 0,0 ms 0,0 ms
Dabei ergibts sich dann bei 5400 und 10800 Hz eine Phasenverschiebung
von über 360°.
Das macht eigentlich keinen Sinn.
Als Lösungsansatz würde ich es mit einer FFT/IFFT versuchen.
Phasen der einzelnen Bins nach der FFT entsprechend verschieben
(rotieren), und dann per IFFT wieder in den Zeitbereich transformieren.
1
x2 = cos(β) x1 − sin (β) * y1
2
y2 = sin(β) x1 + cos (β) * y1
Davor oder danach dann ein Delay um bis zu 1ms auf das Gesamtsignal.
Wozu dient das Ganze eigentlich, wenn man fragen darf?
Mal die analoge Sichtweise: Die Zeitverzögerung eines normales Kabels
dreht die Phase niedriger Frequenzen nur wenig, die der hohen Frequenzen
stark. Gesucht ist hier also eine Art "Kabel negativer Länge". Geht das
kausal überhaupt?
Die Differenz der Laufzeiten zweier irgendwie parallel liegender Kabel
könnte helfen. Das wäre vielleicht das oben vorgeschlagene Abziehen
eines Gesamtdelays.
Christoph db1uq K. schrieb:> Mal die analoge Sichtweise: Die Zeitverzögerung eines normales Kabels> dreht die Phase niedriger Frequenzen nur wenig, die der hohen Frequenzen> stark.
Das liegt daran, dass das Kabel ein konstantes Delay erzeugt das
entspricht bei niedrigeren Frequenzen eben einer geringeren
Phasenverschiebung als bei höheren Frequenzen.
> Gesucht ist hier also eine Art "Kabel negativer Länge".
Nein. Ein Kabel "negativer Länge" - um in deiner Analogie zu bleiben -
würde das Signal negativ verzögern, aber es wäre auch ein konstantes
Delay.
Damit ist die Phasenverschiebung ebenfalls abhängig von der Frequenz
(nur eben mit umgekehrtem Vorzeichen).
Hat aber alles mit DSP nichts zu tun... ;-)
Es ging ja anfangs um analoge Schaltungstechnik
Mich erinnert das ganze an die "Posaune" (Leitung veränderlicher Länge)
in einem vektoriellen Netzwerkanalysator.
Man möchte z.B. den Frequenzgang der Impedanz am Einspeisepunkt einer
Antenne wissen, kommt aber nur 10 Meter weiter unten am Fuß des
Antennenmastes heran. Anstelle eines schönen Kurvenverlaufs im
Smith-Diagramm erhält man endlose Kreise um den Mittelpunkt.
Hier hilft die Posaune. Im Netzwerkanalysator hat man zwei identische
Messzweige, in denen das gemessene Signal und ein Referenzsignal
parallel verarbeitet wird, gemischt auf niedrigere Zwischenfrequenzen
usw. Am Ende geht beides in einen Phasenvergleicher, anderswo wird noch
die Amplitude gemessen und am Ende hat man ein Ergebnis in
Polarkoordinaten.
Um den Einfluß des Kabels wegzurechnen wird einfach in den Referenzzweig
ebenfalls ein Kabel gleicher Länge eingefügt, mit einer Posaune kann man
es noch abgleichen. Macht man die Referenzlänge zu groß, bekommt man die
von mir so bezeichnete negative Kabellänge, man kriecht quasi in die
Antenne hinein.
Früher waren das echte mechanisch veränderbare Kabel, heute wird das
natürlich gerechnet. Also DSP.
Christoph db1uq K. schrieb:> Es ging ja anfangs um analoge Schaltungstechnik
Nicht unbedingt. Diese Idee kam nur auf, weil ich einen Tipp bekommen
hatte. Und weil ich aus Erinnerung noch wusste, dass sich die Phasen in
einem solchen Filter, z.B. einem Tiefpass, so langsam drehen, z.B. von
-90 bis 90 Grad, wenn man ihn durchfährt.
> Mich erinnert das ganze an die "Posaune" (Leitung veränderlicher Länge)> in einem vektoriellen Netzwerkanalysator.
Interessant! Hilft uns das weiter? Da kenne ich mich nicht aus.
> Früher waren das echte mechanisch veränderbare Kabel, heute wird das> natürlich gerechnet. Also DSP.
JA, gerne. Aber wie :-) ?
Christoph db1uq K. schrieb:> Mal die analoge Sichtweise: Die Zeitverzögerung eines normales Kabels> dreht die Phase niedriger Frequenzen nur wenig, die der hohen Frequenzen> stark. Gesucht ist hier also eine Art "Kabel negativer Länge".
Gut geraten! Du bist auf dem richtigen Weg :-)
>Geht daskausal überhaupt?
Das ist die Frage. Da ist mein Wissen eben leider ausgereizt.
Joe F. schrieb:> Du meinst vermutlich umgekehrt.
Nein, es ist schon so, wie dargestellt.
> Als erstes kannst du mal ein Gesamtdelay abziehen, das auf alle> Frequenzen angewandt wird (1ms), dann wird es einfacher.
Leider nicht. Ich brauche diese absolute Verschiebung des Signals. Oder
ich muss das Ursignal rückwaerts schieben. Beide werden ausgegeben. Die
Konstellation ist relevant. Der "Empfänger" benutzt beides. Es dürfen
natürlich offsets drauf sein. Also Original 10ms und Neues 11ms...12ms
wie angegeben. Wenn also der zu bauende Filter 10ms draufaddiert, dann
gebe ich die dem Originalsignal auch mit auf den Weg und es stimmt.
Das mit den 380 Grad Phasendrehung ist nur scheinbar unrichtig, denn die
Verzögerung muss tatsächlich so hinein. Das dies dann schon mehr, als
eine Phase ist, ist für die Anwendung irrelevant. Es geht um die
Abstände. Es dürfte z.B. auch gerne etwas mehr sein, wenn es Richtung
40kHz geht. Von mir aus auch 2.5 oder 3ms, wenn das hilft, die Kurve im
wichtigen Bereich so zu stellen, wie gewünscht.
Um das zu verdeutlichen wird mit der Phase etwas vorangetrieben, wie bei
einem Mehrphasenmotor. Dort passiert es auch, dass die Phase eines Sinus
mehr, als 360 Grad vorwärts schiebt, wenn der Motor sich drehen soll.
Mein Gerät dreht sich natürlich nicht mehr, als 360 Grad. Aber es
verschiebt sich was.
Georg B. schrieb:> Joe F. schrieb:>> Du meinst vermutlich umgekehrt.> Nein, es ist schon so, wie dargestellt.
In der Tabelle verschieben sich die hohen Frequenzen aber weniger als
die niedrigen.
Das steht im Widerspruch zu deiner Angabe
Georg B. schrieb:> die Verschiebung für tiefe Frequenzen von 0...1ms, und die für> hohe gleichförmig bis 2msGeorg B. schrieb:>> Als erstes kannst du mal ein Gesamtdelay abziehen, das auf alle>> Frequenzen angewandt wird (1ms), dann wird es einfacher.> Leider nicht. Ich brauche diese absolute Verschiebung des Signals.
Die absolute Verschiebung kannst du ja als Kombination eines Filters,
der von 0-1 ms verschiebt und einem fixen Delay, das nochmal um 1ms
verschiebt erreichen. Damit kommst du dann auf die Gesamtverschiebung
von 1-2ms.
Ich habe mal ein bisschen mit meinem Filtertool rumgespielt, und deine
Tabelle kommt einem einfachen Allpass sehr nahe.
Um den Knick im oberen Frequenzbereich zu erhalten, wäre dann noch ein
2. Filter 4. Ordnung nötig.
Leider kann das nur die "Maximalkurve" nachbilden und ist nicht
parametrisierbar, ausser es hat hier noch jemand eine Idee, wie man
einen Allpass entsprechend "abschwächen" kann.
Im Diagramm blau sind deine Tabellenwerte, rot ist das Ergebnis der
kombinierten Allpass-Filter.
Wie sieht denn die Gruppenlaufzeit aus?
Hier mein Versuch, mit Excel aus aufeinanderfolgenden Frequenz- und
Laufzeitwerten der Tabelle ein Diagramm zu erstellen, ich hoffe, das ist
so richtig. Was sagt das Filtertool?
Negative Gruppenlaufzeiten - ist das ein Fall für überlichtschnelle
Neutrinos?
Moin,
Hier mal mein Serviervorschlag mittels GNU Octave fuer den bargeldarmen
DSPler. Raus kommen die Koeffizienten fuer ein FIR 400.Kajuete mit einer
Annaehrung an den (hoffentlich) gewunschten Gruppenlaufzeitverlauf.
Abtastfrequenz 200kHz.
Dergute W. schrieb:> Hier mal mein Serviervorschlag mittels GNU Octave
Damit kenne ich mich nicht gut genug aus.
Ich nehme an, das rechte blaue sind die Koeffizienten für einen FIR?
Joe F. schrieb:> In der Tabelle verschieben sich die hohen Frequenzen aber weniger als> die niedrigen.
Wie auch immer, SO ist es richtig. Die Tiefen brauchen mehr
Verschiebung.
> Ich habe mal ein bisschen mit meinem Filtertool rumgespielt, und deine> Tabelle kommt einem einfachen Allpass sehr nahe.
Wow das sieht wirklich spitze aus. Wie formuliere ich den mathematisch?
Moin,
Georg B. schrieb:> Damit kenne ich mich nicht gut genug aus.
Hmm, dann wirds aber schwierig mit solchen Filtern :-)
> Ich nehme an, das rechte blaue sind die Koeffizienten für einen FIR?
Aeeh - nee, das linke Rote sind die Koeffizienten.
Das linke Blaue ist der Amplitudengang.
Das rechte Blaue ist die Gruppenlaufzeit dieses Filters ueber die
normierte Frequenz.
X-Achse: 0 = 0Hz, 3.1415=100kHz (du hattest ja was von 200kHz Sampling
geschrieben).
Y-Achse : Die Verzoegerung des Signals in Samples (also hier 200 Samples
=1msec, (bei 200kHz Samplingfreq.); 400 Samples=2msec.)
Man kann an den Verlaeufen des Amplitudengangs und der Gruppenlaufzeit
sehen, dass das approximiert ist. d.h. nicht "genau" so, wie du's gerne
haettest, sondern es "rippelt" halt so um den gewuenschten Wert herum.
Gruss
WK
Georg B. schrieb:> Wie formuliere ich den mathematisch?
Es gibt unzählige Papers zum Thema Allpass.
Gängige Implementierungen sind i.d.R. IIR (BiQuads) oder FIR.
Die entsprechenden Filter-Koeffizienten auszurechnen ist harmlos
ausgedrückt recht anspruchsvoll, ich nutze dafür einfach ein Tool (FIR
Designer), denn ich mag gerne sehen was ich mache.
Andere nutzen andere Tools, "Dergute W." z.B. nutzt Octave, Mathlab kann
das auch etc., bei minidsp gibts auch ein Excel-Sheet für BiQuads:
https://www.minidsp.com/applications/advanced-tools/advanced-biquad-programminghttps://www.minidsp.com/images/fbfiles/files/All_digital_coefs_v1-20101026.zip
Damit kann man halt keine kaskadierten Filter designen.
Wichtig zu wissen ist, dass die Koeffizienten zur Samplerate passen
müssen.
Mein Excel-Gemälde war völliger Quatsch, vergesst es einfach. Wekas
Programm war für mich Anlaß, mal wieder Octave zu installieren, und zu
versuchen, das Programm nachzuvollziehen.
Hier die beiden Vektoren gdl und phi als Excel-Diagramm, ich hoffe das
stimmt dieses Mal. Die kumulative Summierung in Excel musste ich mir
ergooglen, und dass LOG in Excel der 10er-log ist, in Octave aber der ln
hat auch erst mal zu Verwirrung geführt.
Am oberen Frequenzende beträgt die Phasenverschiebung (ins negative) ja
mehr als hundert Perioden. Das muss alles in die 400 Taps des
FIR-Allpasses reinpassen.
Christoph db1uq K. schrieb:> Am oberen Frequenzende beträgt die Phasenverschiebung (ins negative) ja> mehr als hundert Perioden.
Wo siehst Du die? Die Periode bei 10kHz wären 100us, also 10 Perioden
für die gewünschte 1ms.
> Die kumulative Summierung in Excel musste ich mir> ergooglen, und dass LOG in Excel der 10er-log ist
In Excel gibt man die Basis beim LOG eigentlich immer ausdrücklich an.
Wenn ich richtig gerechnet habe, liegt Nr.9999 bei 60 kHz, dort ist
phi=-648, also etwa 100*2Pi oder 100*360Grad.
Wekas Laufzeitdiagramm reicht nach seiner Aussage bis 100 kHz, habe ich
da noch etwas falsch gemacht?
Moin,
Eigentlich wuerd' ich erwarten, dass das Zeugs mit Index(9999) irgendwo
bei 100kHz liegt, denn ich bin ja von 200kHz Abtastfrequenz ausgegangen,
alldieweilen das im ersten Post steht, dass er das so haben will
Ob das alles stimmt, was ich so dahinprogrammiert hab? Keinen Blassen.
Koennte aber.
Wenn ich ganz am Anfang mal
1
gdl=ones(1,10000);
statt dem von Georg B. gewuenschten Verlauf hinschreib', dann tut man
sich mit der Interpretation des FIR Filters in "b" leichter.
Dann kommt tatsaechlich ein Filter raus, was - oh wunder - alles um 1
Takt verzoegert...
Gruss
WK
Weil es gerade Spaß macht sich mal wieder mit FIR Filterung zu
beschäftigen habe ich mal versucht das Filter durch Überlagern von
Cosinus Wellen zu synthetisieren.
Anbei das Ergebnis.
Sehr aufpassen muss man dabei, dass die Phasenverschiebung in den
höheren Frequenzen keine "Knicke" hat, das gibt sehr unschöne Artefakte.
Daher der Workaround in Zeile 100
1
delay*=0.99986;// smooth transition to 0
Die Windowing Funktion hat Vor- und Nachteile.
Ohne Windowing (bzw. rectangular) hat man zwar weniger Einfluss auf
Delay und Frequenzgang, allerdings nimmt die Welligkeit deutlich zu.
Als Kompromiss bietet sich z.B. ein Cosine-Windowing an, und man erhöht
einfach die Delay-Zeit ein wenig.
Wenn die Samplerate sehr hoch ist, muss auch das Filter entsprechend
länger werden, bei 160 KHz würde ich darüber nachdenken erstmal auf 80
KHz downzusamplen, falls man auf Frequenzen > 40 KHz verzichten kann.
Na jetzt aber... dritter Anlauf, diesesmal hoffentlich richtig.
Frequenzbereich jetzt bis zur Nyquist-Frequenz 100 kHz, dadurch rutscht
allerdings der Tabellenpunkt 1,9ms von 40 auf fast 80 Hz hoch.
Bei 100 kHz passen in das FIR-Filter 200 Perioden (2 ms), die werden
aber schon nach 100 Perioden (1 ms) am Ausgang ausgegeben, das ist dann
die "negative Phasenverschiebung" von 100*360Grad gegenüber den
niedrigen Frequenzen mit etwa 0 Grad Phasenverschiebung.
Muss das Filter kontinuierlich auf die bisher berechnete maximale
Verzögerung einstellbar sein? Durch die Änderung der Filterkoeffizienten
im laufenden Betrieb gibt es doch sicher Artefakte die 2ms lang stören
können.
Eine Filterbank mit N Frequenzbereichen und schmalbandigem Verhalten,
additiv so zusammen gesetzt, dass sich das gewünschte Verhalten ergab.
Signale der Einfachheit mit digitalem Puffer / Dealy verschoben.