Forum: Mikrocontroller und Digitale Elektronik IQ Demodulation auf STM32


von Tim T. (humansloth)


Lesenswert?

Hi,
ich möchte gerne eine IQ Demodulation auf einem STM32 Nucleo 
durchführen.
An den beiden 2 ADC's liegt das Referenzsignal und das modulierte Signal 
an.
Nun möchte ich aus diesen Werten,welche in einem array stehen, das 
Nutzsignal ausrechnen.
Dazu müsste ich doch eigentlich nur das modulierte Signal und das 
Referenzsignal multiplizieren respektive um 90° verschieben und 
multiplizieren. Daraus lässt sich dann wiederum der Winkel und die 
Amplitude berechnen.
Meine bisherige Idee sieht so aus:
1
  for(int i = 0; i < 1000; i++){
2
    I[i] = (carrier[i] * source[i]) * 0.000825195;
3
    Q[i] = (carrier[i] * source[i+25]) * 0.000825195;
4
  }
5
6
  for(int i = 0; i < 1000; i++){
7
    phi[i] = 57.3*(atan(Q[i]/I[i]));
8
    A[i] = sqrt(pow(I[i],2)+pow(Q[i],2));;
9
  }
Ist das so sinnvoll? Wenn ich das modulierte und Referenzsignal als 
sinus und cosinus mit gleicher Frequenz einstelle bekomme ich ein 
alternierende phase, was nicht meinen Erwartungen entspricht. Die Phase 
müsste doch gleich bleiben.
Ist meine Berechnung murks?
Ich bin für jede Hilfe sehr dankbar!

von Dergute W. (derguteweka)


Lesenswert?

Moin,

Dein sin/cos Ansatz haut nur hin, wenn die LO-Frequenz genau 1/100 der 
Abtastfrequenz ist. Der Zugriff
1
[i+25]
 geht auch dann und wann in den Wald.
Und natuerlich ist eine Multiplikation im Zeitbereich eine Faltung im 
Frequenzbereich, d.h. bei einer Multiplikation mit sin(t) oder cos(t) 
Signalen gibts 2 Ausgangsspektren. Nur eines davon ist das 
"demodulierte". Das andere, mit der doppelten Frequenz sollte in einem 
Tiefpass kleben bleiben, wenn du nur demodulieren willst.

Insgesamt: Hoffentlich pressierts nicht mit der Auswertung des 
Signals...

Gruss
WK

von Tim T. (humansloth)


Lesenswert?

Ah stimmt, das hatte ich total vergessen!
Also kann ich nach der Multiplikation theoretisch nen passendes 
digitales Filter hängen und dann müsste die Berechnung hinhauen? Und 
klar die ganzen for-Schleifen etc. sind grade nur sehr provisorisch und 
funktioniert nur für bestimmte Frequenz/Abtastkombinationen, wollte die 
Berechnung erstmal für eine Frequenz hinkriegen. Kann leider erst heute 
abend daran weiter arbeiten...
Aber ich bin wenigstens nicht total auf dem Holzweg?
Vielen Dank!

von Egon D. (Gast)


Lesenswert?

Dergute W. schrieb:

> Und natuerlich ist eine Multiplikation im Zeitbereich
> eine Faltung im Frequenzbereich, d.h. bei einer
> Multiplikation mit sin(t) oder cos(t) Signalen gibts
> 2 Ausgangsspektren. Nur eines davon ist das
> "demodulierte".

Das stimmt zwar -- aber wie Du dem Quelltext entnehmen
kannst, multipliziert er nicht mit Sinus ODER Cosinus,
sondern mit Sinus UND Cosinus.

Je nachdem, ob man anschließend Summe oder Differenz
berechnet, erhält man das untere oder das obere
Seitenband.

von Egon D. (Gast)


Lesenswert?

Tim T. schrieb:

> phi[i] = 57.3*(atan(Q[i]/I[i]));

Hmm. Vielleicht mal nicht "atan()" verwenden, sondern
"atan2()".

von Uwe Bonnes (Gast)


Lesenswert?

Tim T. schrieb:
> Hi,
> ich möchte gerne eine IQ Demodulation auf einem STM32 Nucleo
> durchführen.

Wenn Du etwas warten kannst, warte auf den STM32G4. Der hat eine Cordic 
IP.

von Christoph db1uq K. (christoph_kessler)


Lesenswert?

Die IQ-Demodulation braucht insgesamt 180 Grad Phasenverschiebung, damit 
sich ein Seitenband auslöscht. LO und Signal müssen beide um 90 Grad 
verschoben vorliegen. Das Problem ist immer, dass das Signal ein 
Frequenzgemisch ist, das man entsprechend breitbandig um 90 Grad 
schieben muss.
Für die Einseitenbanderzeugung gibt es in analoger Technik seit 
altersher drei Methoden, Filter- Phasen- und die "dritte Methode" mit 
vier Mischern und zwei LOs. Dasselbe geht im Prinzip auch digital. Die 
Demodulation ist fast identisch dazu.
Einen Breitbandphasenschieber berechnet z.B. Matlab als FIR-Filter mit 
dem Parameter "Hilbert". Das Filter für die andere Seite ist nur eine 
Zeitverzögerung.

: Bearbeitet durch User
von Bernd (Gast)


Lesenswert?

Christoph db1uq K. schrieb:
> LO und Signal müssen beide um 90 Grad
> verschoben vorliegen. Das Problem ist immer, dass das Signal ein
> Frequenzgemisch ist, das man entsprechend breitbandig um 90 Grad
> schieben muss.
Das Signal auch?

Bei den üblichen Bildchen zum Thema [1] sehe ich immer nur, wie ein 
LO-Pfad geschoben wird. Und da das hier digital passieren soll, ist es 
kein Problem mit zwei Zeigern durch die Tabelle zu iterieren um Sinus 
und Cosinus gleichzeitig zu erzeugen.
Die Tabelle muß man nicht mal im Flash ablegen, die kann beim 
Programmstart errechnet werden [2].


[1] https://duckduckgo.com/?q=iq+demodulation&iax=images&ia=images
[2] http://www.technoblogy.com/show?22HF

von Christoph db1uq K. (christoph_kessler)


Lesenswert?

Das Hilbert-Filter steckt in den Blockschaltplänen in einem der 
Tiefpässe. Man muss von den drei Signalen Eingang, LO und Ausgänge immer 
zwei phasenschieben um auf 180 Grad zu kommen.

von Chloé (Gast)


Lesenswert?

Hello Tim T,

"Ist das so sinnvoll? Wenn ich das modulierte und Referenzsignal als
sinus und cosinus mit gleicher Frequenz einstelle bekomme ich ein
alternierende phase, was nicht meinen Erwartungen entspricht. Die Phase
müsste doch gleich bleiben.
Ist meine Berechnung murks?"

Did you find the way to have the correct phase?
I have the same problem.

Thank you

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.