Forum: Digitale Signalverarbeitung / DSP / Machine Learning Breitband-NF-Phasenschieber, DSP mit AVR


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Christoph db1uq K. (christoph_kessler)


Lesenswert?

Hier: http://yehar.com/ViewHome.pl?page=dsp/hilbert/
steht die Beschreibung eines Niederfrequenz-Phasenschiebers aus 8 
IIR-Allpässen, der nur 8 Multiplikationen benötigt, und den 
NF-Sprachfrequenzbereich in zwei um 90 Grad
gegeneinander verschobene Signale auftrennt.

In der Application note AVR223 
http://www.atmel.com/dyn/resources/prod_documents/doc2527.pdf
sind ähnlich große Digitalfilter realisiert.

Das müßte also noch in einen ATmega passen, mit dem eingebauten ADC und 
zwei oder vier PWM-Ausgängen hätte man eine komplette Aufbereitung für 
einen SSB-Sender auf einem Chip.

Ein Mischer aus vier Analogschaltern 74HC4066 und ein 74HC74 und ein 
DDS-Rechteckgenerator und fertig ist der Kurzwellen-SSB-Sender, 
sozusagen ein  SDT= software-defined transmitter.

Ich habe mal das Filter in Scicos als Blockschaltplan eingegeben, bisher 
kommt noch kein Kreis heraus, aber man sieht irgendeinen 
Einschwingvorgang und etwas ellipsenähnliches auf dem "XY-Oszilloskop"

von Christoph db1uq K. (christoph_kessler)


Angehängte Dateien:

Lesenswert?

Das Blockschaltbild hatte ich vergessen

von Christoph db1uq K. (christoph_kessler)


Lesenswert?

Auch für Effektgeräte aus der Musikelektronik ist so ein Phasenschieber 
interessant, zur Simulation rotierender Lautsprecher oder als 
Frequenzshifter gegen akustische Rückkopplung.

Im Amateurfunk denke ich an einen Fuchsjagdsender im 80m-Band ( 
3,5...3,8 MHz) mit Sprachausgabe. Zweckmäßigerweise wäre der Quarz am 
ATmega gleichzeitig die vierfache Trägerfrequenz, muß also zwischen 14,0 
und 15,2 MHz liegen. Da gibt es z.B. die NTSC-Farbträgerquarze auf 
14,318 MHz, den Baudratequarz auf 14,76 oder auch 15 MHz oder die alten 
"TR2200"-Empfangsquarze, die auch Reichelt jahrelang im Programm hatte.

Leider gibt Olli aus Finnland kein Berechnungsverfahren an. Weiß jemand, 
ob dafür ein einfaches Programm existiert? Er schreibt nur:
"The coefficients were found using a generic evolutionary algorithm. I 
believe that it would be possible to design coefficients for this filter 
structure using the software by Artur Krukowski, which finds 
coefficients for halfband filters: 
http://www.cmsa.wmin.ac.uk/~artur/Poly.html";

von Bernd (Gast)


Lesenswert?

Link funktioniert nicht!

... http://www.cmsa.wmin.ac.uk/~artur/Poly.html%22 ...

von Gast (Gast)


Lesenswert?


von Detlef _. (detlef_a)


Angehängte Dateien:

Lesenswert?

Krieg ich auch nicht nachvollzogen. Die Phasen werden von -75° bis -110° 
geschoben, nix +/-0.7°. Vielleicht hab ich mich aber auch verhackt.

gute Nacht
Detlef

clear

aq=0.6923878;      h1b=[aq 0 -1];h1a=[1 0 -aq];
aq=0.9360654322959;h2b=[aq 0 -1];h2a=[1 0 -aq];
aq=0.9882295226860;h3b=[aq 0 -1];h3a=[1 0 -aq];
aq=0.9987488452737;h4b=[aq 0 -1];h4a=[1 0 -aq];

hb=conv(conv(h1b,h2b),conv(h3b,h4b));
ha=conv(conv(h1a,h2a),conv(h3a,h4a));
hb=conv(hb,[0 1]); %nochn delay
n=256;
H1=freqz(hb,ha,n);

aq=0.4021921162426;h1b=[aq 0 -1];h1a=[1 0 -aq];
aq=0.8561710882420;h2b=[aq 0 -1];h2a=[1 0 -aq];
aq=0.9722909545651;h3b=[aq 0 -1];h3a=[1 0 -aq];
aq=0.9952884791278;h4b=[aq 0 -1];h4a=[1 0 -aq];
hb=conv(conv(h1b,h2b),conv(h3b,h4b));
ha=conv(conv(h1a,h2a),conv(h3a,h4a));
H2=freqz(hb,ha,n);

%plot(1:n,(angle(H1)),'b.-',1:n,(angle(H2)),'r.-');
%plot(1:n,unwrap(angle(H1)),'b.-',1:n,unwrap(angle(H2)),'r.-');
plot(1:n,(180/pi)*(unwrap(angle(H1))-unwrap(angle(H2))),'r.-');

return

von Detlef _. (detlef_a)


Angehängte Dateien:

Lesenswert?

Huch, ja, verhackt, Quadrat vergessen. Jetzt hauts gut hin. Christoph, 
dann hast Du vermutlich noch nen flaw in Deiner graphischen 
Implementation.

Cheers
Detlef

clear

aq=0.6923878;      aq=aq*aq;h1b=[aq 0 -1];h1a=[1 0 -aq];
aq=0.9360654322959;aq=aq*aq;h2b=[aq 0 -1];h2a=[1 0 -aq];
aq=0.9882295226860;aq=aq*aq;h3b=[aq 0 -1];h3a=[1 0 -aq];
aq=0.9987488452737;aq=aq*aq;h4b=[aq 0 -1];h4a=[1 0 -aq];

hb=conv(conv(h1b,h2b),conv(h3b,h4b));
ha=conv(conv(h1a,h2a),conv(h3a,h4a));
hb=conv(hb,[0 1]); %nochn delay
n=256;
H1=freqz(hb,ha,n);

aq=0.4021921162426;aq=aq*aq;h1b=[aq 0 -1];h1a=[1 0 -aq];
aq=0.8561710882420;aq=aq*aq;h2b=[aq 0 -1];h2a=[1 0 -aq];
aq=0.9722909545651;aq=aq*aq;h3b=[aq 0 -1];h3a=[1 0 -aq];
aq=0.9952884791278;aq=aq*aq;h4b=[aq 0 -1];h4a=[1 0 -aq];
hb=conv(conv(h1b,h2b),conv(h3b,h4b));
ha=conv(conv(h1a,h2a),conv(h3a,h4a));
H2=freqz(hb,ha,n);

%plot(1:n,(angle(H1)),'b.-',1:n,(angle(H2)),'r.-');
plot(1:n,unwrap(angle(H1)),'b.-',1:n,unwrap(angle(H2)),'r.-');
%plot(1:n,(180/pi)*(unwrap(angle(H1))-unwrap(angle(H2))),'r.-');

return

von Detlef _. (detlef_a)


Lesenswert?

In dem paper von Olli ist das Vorzeichen von b2 falsch. Möglicherweise 
kappt das deswegen bei Dir nicht, Christoph.

gute Nacht
Detlef

PS: Warum kann ich meine eigenen post eigentlich nicht editieren?

von Christoph db1uq K. (christoph_kessler)


Angehängte Dateien:

Lesenswert?

Hier mal zum Mitspielen das Scicos-File. Einfach unter
http://www.scilab.org/download/index_download.php
die 15 MByte runterladen und installieren, dann das .cos-File anklicken. 
Zuerst geht das Scilab-Textfenster auf, dann das Scicos-Blockdiagramm. 
Mit "Simulate-Run" erscheinen die Oszilloskop-Fenster.

von Christoph db1uq K. (christoph_kessler)


Lesenswert?

Wie bringe ich eigentlich Scicos dazu, statt "-K-" den Koeffizienten im 
GAINBLK anzuzeigen?
Ich hatte zuerst die Zahl mit Komma statt Punkt eingetragen, was Scicos 
als zweidimensionalen Vektor interpretierte und eine Fehlermeldung 
ausgab.

von Detlef _. (detlef_a)


Lesenswert?

>>In dem paper von Olli ist das Vorzeichen von b2 falsch.
Nee, ist doch richtig. hm.

Cheers
Detlef

von Weinga-Unity (Gast)


Lesenswert?

Das "-K-" Problem ist anscheinend erst ab der Version 4.1.2 vorhanden 
(bzw. bewusst implementiert worden). Kuck mal die Palette mit OldBlocks. 
Der Gain dort sollte die Koeffizienten wieder anzeigen können (habs 
gerade ausprobiert).

mfg W.K.

von Christoph db1uq K. (christoph_kessler)


Angehängte Dateien:

Lesenswert?

also die Vorzeichen sind wirklich verwirrend.

Erstmal hat Olli die Koeffizienten genau umgekehrt bezeichnet als sonst 
, in Wikipedia http://en.wikipedia.org/wiki/Infinite_impulse_response
steht: b_i are the feedforward filter coefficients,
a_i are the feedback filter coefficients.

und auch die Vorzeichen sind dort umgekehrt.

der alte Gainblk heißt GAINBLK_f, den kann ich mal einbauen.

von Christoph db1uq K. (christoph_kessler)


Angehängte Dateien:

Lesenswert?

Auf der Suche nach einem "Kochrezept" für IIR-Hilbert-Filter ist das 
hier bisher die einzige heiße Spur. Auch Olli hat sich hier 2003 zu Wort 
gemeldet, und Peter K1PO bietet einen Lösungsweg an ( ich blicke noch 
nicht durch, klingt aber gut).

von Christoph db1uq K. (christoph_kessler)


Lesenswert?

Da fehlte noch Peters letzte Antwort, hier der vollständige Thread:
http://groups.google.de/group/comp.dsp/browse_thread/thread/23614ddf63a38a72/cc95dc993ff8bf1c

von Christoph db1uq K. (christoph_kessler)


Angehängte Dateien:

Lesenswert?

So würde die Schaltung eines einfachen Einseitenband-Senders für 3,75 
MHz aussehen. Die vier 256-stufigen PWM-Ausgänge werden mit einem 
passiven Cauer-Tiefpass gefiltert, das bei der PWM-Frequenz 58,8 kHz 
einen Dämpfungspol hat, und etwa bis 10 kHz durchläßt.

von Olli Niemitalo (Gast)


Lesenswert?

If I recall correctly, HIIR by Laurent de Soras can calculate 
coefficients for the 90 degree phase difference IIR filter pair:

http://ldesoras.free.fr/prod.html#src_hiir

von Christoph db1uq K. (christoph_kessler)


Lesenswert?

Hi Olli
thanks for the link, inside this zipped file he refers to other sources:
http://www.iua.upf.es/dafx98/papers/WAR19.PS.zip
"A Hilbert-Transformer Frequency Shifter for Audio" by Scott Wardle
and here we find a reference to a book ISBN 0471619957  Handbook for 
Digital Signal Processing (1993) which describes these filters.

I'm still struggling with Application note AVR223 which is written for 
IAR assembler, not for AVRStudio. ADC and DAC by PWM works.

von Christoph db1uq K. (christoph_kessler)


Lesenswert?

Das Buch werde ich mal ausleihen, 20 Seiten allein zum Thema Hilbert. 
Auch IIR-Hilbert-Filter. (Bei Amazon kann man das Inhaltsverzeichnis 
"inside searchen")ca.1270 Seiten, ein wirklich dicker Wälzer. Die 
beschriebene Hardware von 1993 ist allerdings doch etwas veraltet. 
Gebraucht immer noch über 200 €, das ist happig.
Zur Appnote223: ich mußte nur aus "BLAHBLAH MACRO" ein ".MACRO BLAHBLAH" 
machen, ebenso einen Punkt vor "ENDMACRO". Außerdem heißt der erste 
Übergabeparameter nicht "\1" sondern "@0".

von Christoph db1uq K. (christoph_kessler)


Lesenswert?

Das Buch habe ich inzwischen bekommen, sieht interessant aus, es gibt 
von Artech sogar ein Buch speziell zu Hilbert ISBN 0890068860 , das will 
ich mir auch noch anschauen.

Allmählich fürchte ich, die AVR223 wurde nie praktisch erprobt:
- im gezippten Quelltext ist ein Schreibfehler, X3 wird nach X2 kopiert 
statt nach X4.
- In der Koeffiziententabelle wird ( der Vollständigkeit halber? ) auch 
A0 aufgelistet, obwohl A0 auf 1 normiert ist und nirgends an das 
Programm übergeben wird.
- Es steht nirgends, ob man die Vorzeichen der A_n aus der Tabelle noch 
drehen muß, da sie in der Formel subtrahiert werden.

von Gast (Gast)


Lesenswert?

@db1uq
Ja, in AVR223 steckt der Fehlerteufel, wie Du richtig erkannt
hast. ;-)
73, August

von Christoph db1uq K. (christoph_kessler)


Lesenswert?

Ah ja, ich nehme an, DER August - sehen wir uns übermorgen dort ?
http://www.iprt.de/IPRT2008/index.html
24. IPRT Fachtagung für digitale Datenübertragung im Amateurfunk 5. 
April 2008 in Darmstadt

von Christoph db1uq K. (christoph_kessler)


Lesenswert?

Ich suche nach meinem Programmierfehler, weil das Filter einfach nicht 
funktioniert, dabei steckt der Fehler in der AVR223:

5 Schreibfehler in "6th_order_IIR.s90":

  LOAD_NODE X3
  UPDATE_NODE X2 ; richtig: X4

  LOAD_NODE Y5
  UPDATE_NODE X6 ; richtig: Y6

  LOAD_NODE Y4
  UPDATE_NODE X5 ; richtig: Y5

  LOAD_NODE Y3
  UPDATE_NODE X4 ; richtig: Y4

  LOAD_NODE Y2
  UPDATE_NODE X3 ; richtig: Y3

das kann ja nicht gutgehen

von Christoph db1uq K. (christoph_kessler)


Lesenswert?

da liegt noch ein dicker Hund begraben:

;Due to coefficient scaling (gain factor 2^14) the output requires 
"unscaling"
  lsl AC1         ; Scaling to gain factor 2^15
  rol AC2      ; --
  rol  AC3      ; --

  lsl AC1         ; Scaling to gain factor 2^16
  rol AC2      ; --
  rol  AC3      ; --

das Vorzeichen fällt beim ersten Linksschieben von AC3 raus
mit bst AC3,7
    lsl....
    bld AC3,7
wird das Vorzeichen im T-Flag gerettet und wiederhergestellt, so 
stimmts.

von Gast (Gast)


Lesenswert?

Hallo Christoph,
ja, aus der PR-Tagung wurde leider nichts.

Ich fürchte, diese carry-bit-Operation hilft nicht wirklich.
Wenn nicht alle drei höchsten Bits 0 oder alle drei 1 sind
(vor den lsl-rol-Operationen, versteht sich), liegt ein
Überlauf vor, der Dir einen Vorzeichenfehler bescheren wird.
Da hilft dann nur, die Skalierung anzupassen oder mit kleineren
Input-Werten zu arbeiten.

Kennst Du Oberstar? Kuckst Du hier:
http://www.superkits.net/whitepapers/Optimization-
NarrowBandFixedPointFilterImplementedOnALowCostMCU.pdf

Nette Sache, soll Dich aber nicht von AVR223 ablenken. ;-)

Dein Projekt ist sehr interessant - macht mich neugierig,
wie es ausgeht. Bensheim oder AMTEC :-)

Mit welchem Takt willst Du die CPU betreiben und welche
Sampling-Rate soll eingesetzt werden?

August

von Christoph db1uq K. (christoph_kessler)


Lesenswert?

page not found bei Superkits

Zur Zeit betreibe ich einen ATmega644 auf dem STK200 mit einem 
"145,700MHz"-Quarz und vernünftig umgebautem Oszillator (wie sonst 
üblich und im Quarzkochbuch so gezeigt, nicht die verkorkste 
STK200-Schaltung, die machte sehr seltsame Schwingungsformen) (145,7 - 
10,7) :9 = 15 MHz

Der ADC ist schon etwas overclocked mit 15 MHz/64 = 234,375 kHz, 
empfohlen sind max 200. Damit ist die Samplerate 18 kHz, ein 3 kHz Sinus 
ist mit nur 6 Stützstellen schon leicht verbeult. PWM mit 15MHz/256=56 
kHz. Als Empfänger könnte man dieselbe Konfiguration mit zwei getrennten 
Eingängen und gemeinsamem Ausgang verwenden, leider verdoppelt der 
Eingangsmux der ATmegas die Wandlungszeit, deshalb würde ich mit 
15MHz/32 und einem externen Umschalter arbeiten. Statt des 4066 einfach 
ein 4053, der hat noch einen Schalter übrig.

von Gast (Gast)


Lesenswert?

Hallo Christoph,
das PDF gibt es noch - habe gestern nochmal geprüft.
Klebe die zweite Zeile an die URL dran... war ne superlange URL,
die ich gebrochen habe. Das "-" zwischen "Optimization" und "NarrowBand"
gehört dazu.

18 kHz Samplerate... hast Du schon überschlagen, wie viel Rechenzeit
Deine IIR-Filter beanspruchen, bzw. soll die CPU nebenher noch andere
Dinge erledigen?

Ich habe hier etwas mit 8 kHz Samplerate (= 125 us je Datum), die CPU
läuft mit 12,288 MHz und das (eine) IIR6 stiehlt ohne Optimierungen
worst case 1/3 dieser 125 us.

August

von Christoph db1uq K. (christoph_kessler)


Lesenswert?

Die 13 Multiplikationen aus AVR223 6th-orderIIR brauchen ( noch nicht 
nachgemessen) knapp 500 Takte, also 30 kHz maximal mögliche Samplerate. 
Der Phasenschieber hat nur 8 Multiplikationen. Ich lasse die Berechnung 
im free running ADC-Interrupt laufen, dann hat der Atmega immer noch 
einige Zeit für irgendwelche DDS/Drehgeber/Displayansteuerung übrig.
Deinen PSK31-Decoder im AATIS Praxisheft habe ich gesehen.

von Christoph db1uq K. (christoph_kessler)


Lesenswert?

So jetzt habe ich auch mal den Artikel
http://www.superkits.net/whitepapers/Optimization-NarrowBandFixedPointFilterImplementedOnALowCostMCU.pdf
angesehen (mal sehen ob das auch einen Zeilenumbruch einfügt). Der 
rechnet anscheinend nur mit 8 Bit Fixkomma, das ist sicher etwas wenig.
In AVR223 sind es ja 16 Bit und 16*16=32 Bit Multiplikationen. Da der 
ADC nur 10 Bit liefert ist noch genug Platz für Überläufe.

Ich denke als einfaches Filterbeispiel an ein 1750Hz Notchfilter, um auf 
Relaisfunkstellen ohne die nervigen Tonrufe mitzuhören. Mit dem 
IIR-Befehl in Scilab habe ich eine Transferfunktion für das 
6th-order-Filter berechnet, wenn das nicht schwingt werde ich es mal 
hier posten.

von Gast (Gast)


Lesenswert?


von Christoph db1uq K. (christoph_kessler)


Lesenswert?

stimmt, ist anscheinend derzeit offline

von Christoph db1uq K. (christoph_kessler)


Angehängte Dateien:

Lesenswert?

Yehar.com ist immer noch offline, hier die Seite als PDF

von Christoph db1uq K. (christoph_kessler)


Angehängte Dateien:

Lesenswert?

Und hier der Artikel "A Hilbert-Transformer Frequency Shifter for Audio" 
in PDF umgewandelt:
http://www.iua.upf.es/dafx98/papers/WAR19.PS
von Scott Wardle vom Musikelektronikhersteller Emu http://www.emu.com/

Eigentlich könnte der ATmega auch noch die niederfrequente (ca. 10 Hz) 
sin/cos-Schwingung erzeugen und im ADC-Interrupt die beiden Mischungen 
ausführen, dann hätten wir ein Audioeffektgerät in einem IC.

von Christoph db1uq K. (christoph_kessler)


Lesenswert?

Danke August für die Platine.

So, das Hilbert-Buch ISBN 0890068860 liegt mir jetzt auch vor.
Der Autor ist ein polnischer Professor, der damals 75 Jahre alt war. Zu 
IIR-Hilbert-Transformatoren hat er vor allem eine Literaturstelle:
Ansari, R. "IIR discrete-time Hilbert transformers" vom August 1987
und beklagt sich darüber. "wir versuchten das nachzuvollziehen, aber da 
scheint etwas zu fehlen ... das Buch muß fertig werden, wir haben keine 
Zeit das noch herauszufinden"
Im Wesentlichen scheint es derselbe Berechnungsweg wie im 
Mitra/Regalia-Buch zu sein, soweit ich das verstanden habe:
Man berechnet einen elliptischen IIR-Halbband-Tiefpass mit Polen auf der 
imaginären Achse, substituiert (?) dann z durch -jz^2, wodurch die Pole 
auf der reellen Achse liegen und alle Koeffizienten der z mit ungeradem 
Exponenten Null sind. Dann teilt man die Pole abwechselnd auf die beiden 
Allpässe auf.

von Rudi D. (rulixa)


Lesenswert?

Hier habe ich den besten Designer für SSB 90° gefunden.

http://www.werewoolf.org.je/apf.htm

Hatte email Kontakt mit Werewoolf, er hat den Algorithmus nur 
programmiert, nicht entwickelt sagte er, wenn ich es richtig verstanden 
habe.
Man kann von 20Hz -20 kHz mit geringem phi Fehler 90° schieben.
Eigentlich nur mit DSP zu realisieren, die Bauteiltoleranzen sind sehr 
kritisch wenns mans analog tun wollte.

Bin gerade dabei dies für ATmega 8 zu untersuchen, wie breitbandig ich 
das schaffe mit dem 10bit ADC. Es ist ja nur eine MUL je Samplewert und 
Allpasstufe auszuführen. Die Dynamik ist halt klein mit Mega8 als DSP.

Ich hoffe der Beitrag ist noch interessant. Hab ja hier auch mal nach 
sowas gefragt.

von Christoph db1uq K. (christoph_kessler)


Lesenswert?


von Rudi D. (rulixa)


Angehängte Dateien:

Lesenswert?

Ich bin in Mathe nicht so gut. Nur Mittelschule.
Habe mir alles selbst erarbeitet. Allpass besteht aus Ui und -Ui,
an den Ausgängen das RC-Glied, an dessen Verbindung das Ausgangssignal 
gegenüber Ui steht.
Gleichungen sind ja höchst einfach aus dieser Schaltung zu entnehmen.

Man sieht in dem Excel, dass man mit der Abtastrate gut aufpassen muss, 
sonst fängt es an stark einzuschwingen.
Man kann ja mit den Werten herumspielen.

Habe vor Jahren mit den Diff. Gleichungen einen RC-Oszillator, der ja im 
Prinzip ein IIR Filter ist, wie ich nun weiss; als auch ein TT-Glied 
berechnet. Erst jetzt, als ich mit uC's anfange erinnerte ich mich 
wieder daran, dass ich ja sozusagen schon mitten in DSP war damit.

Dein Programm muss ich erst durcharbeiten, verstehe die Strukturen noch 
nicht. Da gibts ja auch Rückkopplungen, die ja typ. für IIR sind.
Bei mir wäre es ja eine FIR Struktur. Mit APF weiss ich ja was zu 
schaffen ist mit wieviel Stufen. 2x4 Stufen +-2°von 20Hz-20kHz und 
+-0,5° bei 2x5 Stufen.
Werde es mit 16bit MUL versuchen im Mega8.
APF läuft übrigens super mit WINE auf Kubuntu.

von austrianeuling (Gast)


Lesenswert?

Hallo,
ich werde demnaechst nach Wien ziehen. Weiss von euch jemand was ein 
guter DSL Anbieter in Oeserreich ist? Vielen Dank erst mal für die 
Hilfe.

von Rudi D. (rulixa)


Lesenswert?

austrianeuling schrieb:
> Hallo,
> ich werde demnaechst nach Wien ziehen. Weiss von euch jemand was ein
> guter DSL Anbieter in Oeserreich ist? Vielen Dank erst mal für die
> Hilfe.

Nimm die Telekom 2 Mbit/s ohne Limit incl. Festnetz und 3 Handys mit 5 
ct/min in alle Netze um
19,90 je Monat. Aktionen abwarten.

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.