Forum: Digitale Signalverarbeitung / DSP / Machine Learning frequenzabhängige Phasenverschiebung erzeugen


von -gb- (Gast)


Lesenswert?

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,0 ms   2,0 ms
3
   10Hz : 0,0 ms   2,0 ms
4
   20Hz : 0,0 ms   2,0 ms
5
   -------------  Eckfrequenz Unten
6
   40Hz : 0,0 ms   1,9 ms
7
   80Hz : 0,0 ms   1,8 ms
8
  160Hz : 0,0 ms   1,7 ms
9
  320Hz : 0,0 ms   1,6 ms
10
  680Hz : 0,0 ms   1,5 ms
11
 1350Hz : 0,0 ms   1,4 ms
12
 2700Hz : 0,0 ms   1,3 ms
13
 5400Hz : 0,0 ms   1,2 ms
14
10800Hz : 0,0 ms   1,1 ms
15
----------------  Eckfrequenz Oben
16
21000Hz : 0,0 ms   1,0 ms
17
30000Hz : 0,0 ms   1,0 ms

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.

von Dergute W. (derguteweka)


Lesenswert?


von Joe F. (easylife)


Lesenswert?

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?

: Bearbeitet durch User
von Christoph db1uq K. (christoph_kessler)


Lesenswert?

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.

: Bearbeitet durch User
von Joe F. (easylife)


Lesenswert?

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... ;-)

: Bearbeitet durch User
von Christoph db1uq K. (christoph_kessler)


Lesenswert?

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.

: Bearbeitet durch User
von Christian K (Gast)


Lesenswert?

Schau mal ob ein Allpass Filter das ist was du suchst. Ein Filter mit 
frequenzunabhängigen Gain aber frequenzabhängiger Gruppenlaufzeit.

von -gb- (Gast)


Lesenswert?

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.

von Joe F. (easylife)


Angehängte Dateien:

Lesenswert?

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 2ms

Georg 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.

von Christoph db1uq K. (christoph_kessler)


Angehängte Dateien:

Lesenswert?

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?

von Dergute W. (derguteweka)


Angehängte Dateien:

Lesenswert?

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.
1
%desired groupdelay:
2
gdl=[400 400 400 400 [400-200/6.21461*(log(2500)+log((4:2000)/10000))] 200*ones(1,7999)];
3
phi=-cumsum(gdl)/10000*pi;
4
h=exp(j*phi);
5
w=(0:9999)/10000*pi;
6
%FIR filter 400th order
7
[b,a]=invfreqz(h,w,400,0);
8
%FIR coefficients in b

So schaut's dann aus. Komm' ich getz' in Fernsehen?

Gruss
WK

von -gb- (Gast)


Lesenswert?

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?

von Dergute W. (derguteweka)


Lesenswert?

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

von Joe F. (easylife)


Lesenswert?

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-programming
https://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.

von Christoph db1uq K. (christoph_kessler)


Angehängte Dateien:

Lesenswert?

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.

von J. S. (engineer) Benutzerseite


Lesenswert?

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.

von Christoph db1uq K. (christoph_kessler)


Lesenswert?

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?

von Dergute W. (derguteweka)


Lesenswert?

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

von Joe F. (easylife)


Angehängte Dateien:

Lesenswert?

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.

: Bearbeitet durch User
von Christoph db1uq K. (christoph_kessler)


Angehängte Dateien:

Lesenswert?

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.

von -gb- (Gast)


Lesenswert?

Falles es einen interessiert: Es wurde mit einer mathematischen 
Filterbank gelöst.

von Dergute W. (derguteweka)


Lesenswert?

Moin,

Waer's moeglich, vielleicht bissl mehr ins Detail zu gehen?

Gruss
WK

von -gb- (Gast)


Lesenswert?

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.

von J. S. (engineer) Benutzerseite


Lesenswert?

-gb- schrieb:
> dass die tiefen Anteile unter etwa 24fps einstellbar um 0...2ms
> verschoben
24 frames per seconds???

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.