www.mikrocontroller.net

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

Autor: Christoph Kessler (Firma db1uq) (christoph_kessler)
Datum: 26.02.2008 16:36

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/...
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"
Autor: Christoph Kessler (Firma db1uq) (christoph_kessler)
Datum: 26.02.2008 16:37
Dateianhang: Hilbert_IIR.png (102 KB, 205 Downloads)
preview image for Hilbert_IIR.png

Das Blockschaltbild hatte ich vergessen
Autor: Christoph Kessler (Firma db1uq) (christoph_kessler)
Datum: 26.02.2008 18:15

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";
Autor: Bernd (Gast)
Datum: 26.02.2008 19:25

Link funktioniert nicht!

... http://www.cmsa.wmin.ac.uk/~artur/Poly.html%22 ...
Autor: Gast (Gast)
Datum: 26.02.2008 20:21

Autor: Detlef _a (detlef_a)
Datum: 26.02.2008 23:19
Dateianhang: Clipboard04.jpg (76,8 KB, 55 Downloads)
preview image for Clipboard04.jpg

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
Autor: Detlef _a (detlef_a)
Datum: 26.02.2008 23:42
Dateianhang: Clipboard01.jpg (49 KB, 70 Downloads)
preview image for Clipboard01.jpg

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
Autor: Detlef _a (detlef_a)
Datum: 27.02.2008 00:02

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?
Autor: Christoph Kessler (Firma db1uq) (christoph_kessler)
Datum: 27.02.2008 07:11
Dateianhang: Hilbert_iir.cos (388 KB, 77 Downloads)

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.
Autor: Christoph Kessler (Firma db1uq) (christoph_kessler)
Datum: 27.02.2008 07:13

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.
Autor: Detlef _a (detlef_a)
Datum: 27.02.2008 09:42

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

Cheers
Detlef
Autor: Weinga-Unity (Gast)
Datum: 27.02.2008 09:51

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.
Autor: Christoph Kessler (Firma db1uq) (christoph_kessler)
Datum: 27.02.2008 10:19
Dateianhang: Allgem_IIR_Uebertragungsgleichung.png (1,4 KB, 29 Downloads)
preview image for Allgem_IIR_Uebertragungsgleichung.png

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.
Autor: Christoph Kessler (Firma db1uq) (christoph_kessler)
Datum: 28.02.2008 13:28
Dateianhang: DSPrelated.pdf (69,9 KB, 116 Downloads)

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).
Autor: Christoph Kessler (Firma db1uq) (christoph_kessler)
Datum: 28.02.2008 14:11

Da fehlte noch Peters letzte Antwort, hier der vollständige Thread:
http://groups.google.de/group/comp.dsp/browse_thre...
Autor: Christoph Kessler (Firma db1uq) (christoph_kessler)
Datum: 20.03.2008 14:18
Dateianhang: AVR_Hilbert_SSB_Sender.png (26,8 KB, 122 Downloads)
preview image for AVR_Hilbert_SSB_Sender.png

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.
Autor: Olli Niemitalo (Gast)
Datum: 26.03.2008 16:18

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
Autor: Christoph Kessler (Firma db1uq) (christoph_kessler)
Datum: 27.03.2008 11:58

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.
* Anzeige-Link
Antwort
Autor: Christoph Kessler (Firma db1uq) (christoph_kessler)
Datum: 27.03.2008 19:27

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".
Autor: Christoph Kessler (Firma db1uq) (christoph_kessler)
Datum: 02.04.2008 08:32

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.
* Anzeige-Link
Antwort
Autor: Gast (Gast)
Datum: 02.04.2008 23:32

@db1uq
Ja, in AVR223 steckt der Fehlerteufel, wie Du richtig erkannt
hast. ;-)
73, August
Autor: Christoph Kessler (Firma db1uq) (christoph_kessler)
Datum: 03.04.2008 09:21

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
Autor: Christoph Kessler (Firma db1uq) (christoph_kessler)
Datum: 08.04.2008 08:34

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
Autor: Christoph Kessler (Firma db1uq) (christoph_kessler)
Datum: 09.04.2008 08:35

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.
Autor: Gast (Gast)
Datum: 10.04.2008 01:55

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
Autor: Christoph Kessler (Firma db1uq) (christoph_kessler)
Datum: 10.04.2008 08:59

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.
Autor: Gast (Gast)
Datum: 10.04.2008 09:26

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
Autor: Christoph Kessler (Firma db1uq) (christoph_kessler)
Datum: 10.04.2008 09:35

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.
Autor: Christoph Kessler (Firma db1uq) (christoph_kessler)
Datum: 10.04.2008 12:20

So jetzt habe ich auch mal den Artikel
http://www.superkits.net/whitepapers/Optimization-...
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.
Autor: Gast (Gast)
Datum: 10.04.2008 13:10

Autor: Christoph Kessler (Firma db1uq) (christoph_kessler)
Datum: 10.04.2008 13:45

stimmt, ist anscheinend derzeit offline
Autor: Christoph Kessler (Firma db1uq) (christoph_kessler)
Datum: 11.04.2008 08:25
Dateianhang: hilbert_Olli_Niemitalo.pdf (62,4 KB, 41 Downloads)

Yehar.com ist immer noch offline, hier die Seite als PDF
Autor: Christoph Kessler (Firma db1uq) (christoph_kessler)
Datum: 11.04.2008 08:31
Dateianhang: Audio_Hilbert_WAR19.pdf (125,7 KB, 45 Downloads)

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.
Autor: Christoph Kessler (Firma db1uq) (christoph_kessler)
Datum: 21.04.2008 12:16

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.
* Anzeige-Link
Antwort

Antwort schreiben

Die Angabe einer Email-Adresse ist freiwillig. Wenn Sie automatisch per Email über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Suchfunktion und Betreffsuche benutzen - vielleicht gibt es schon einen ähnlichen Beitrag
  • Aussagekräftigen Betreff wählen
  • Im Betreff angeben um welchen Controllertyp es geht (AVR, PIC, ...)
  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang
  • JPEG-Dateien (.jpg) nur für Fotos verwenden, Schaltpläne, Screenshots usw. als PNG oder GIF anhängen

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [pre]vorformatierter Text (z.B. Code in anderen Sprachen)[/pre]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel






webmaster@mikrocontroller.netImpressumWerbung auf Mikrocontroller.net