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"
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"
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
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
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?
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.
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.
>>In dem paper von Olli ist das Vorzeichen von b2 falsch.
Nee, ist doch richtig. hm.
Cheers
Detlef
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.
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.
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).
Da fehlte noch Peters letzte Antwort, hier der vollständige Thread: http://groups.google.de/group/comp.dsp/browse_thread/thread/23614ddf63a38a72/cc95dc993ff8bf1c
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.
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
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.
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".
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.
@db1uq Ja, in AVR223 steckt der Fehlerteufel, wie Du richtig erkannt hast. ;-) 73, August
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
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
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.
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
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.
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
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.
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.
Yehar.com ist immer noch offline, hier die Seite als PDF
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.
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.
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.
Schau mal ins Wiki, da habe ich einen Artikel zum Thema angefangen. Digitalfilter mit ATmega und http://www.mikrocontroller.net/articles/Hilbert-Transformator_(Phasenschieber)_mit_ATmega
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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.