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"
Datum: 26.02.2008 16:37
Das Blockschaltbild hatte ich vergessen
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"
Datum: 26.02.2008 19:25
Link funktioniert nicht! ... http://www.cmsa.wmin.ac.uk/~artur/Poly.html%22 ...
Datum: 26.02.2008 20:21
Datum: 26.02.2008 23:19
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
Datum: 26.02.2008 23:42
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
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?
Datum: 27.02.2008 07:11
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.
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.
Datum: 27.02.2008 09:42
>>In dem paper von Olli ist das Vorzeichen von b2 falsch.
Nee, ist doch richtig. hm.
Cheers
Detlef
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.
Datum: 27.02.2008 10:19
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.
Datum: 28.02.2008 13:28
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).
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...
Datum: 20.03.2008 14:18
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.
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
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.
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".
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.
Datum: 02.04.2008 23:32
@db1uq Ja, in AVR223 steckt der Fehlerteufel, wie Du richtig erkannt hast. ;-) 73, August
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
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
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.
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
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.
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
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.
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.
Datum: 10.04.2008 13:45
stimmt, ist anscheinend derzeit offline
Datum: 11.04.2008 08:25
Yehar.com ist immer noch offline, hier die Seite als PDF
Datum: 11.04.2008 08:31
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.
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.
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




