Forum: Digitale Signalverarbeitung / DSP / Machine Learning Frequenzlinie ausfiltern und deren Amplitude auswerten


von A. M. (am85)


Lesenswert?

Hi

Vielleicht kann mir ja jemand ein paar hilfreiche Ratschläge zu meinen 
Überlegungen geben. Das würde mich sehr freuen. Die nachfolgenden 
Überlegungen möchte ich gerne auf einem ARM Cortex M3 realisieren (nicht 
in Echtzeit).

Es geht um Folgendes: Aus einem digitalen Mikrofon kommt ein Signal, das 
eine bestimmte Frequenz und einige Störfrequenzen und Rauschen enthält. 
Die Frequenz, auf die es mir ankommt, kann über eine zweite Quelle 
bestimmt werden (Periodenmessung eines "Triggersignals"). Ich möchte nun 
über einen relativ großen Bereich die Amplitude der Frequenzlinie im 
Spektrum des Mikrofonsignals messen und dachte mir, dass ich über die 
gemessene, einzelne Frequenz ganz gut an die Spektrallinie im Messsignal 
heran kommen könnte.

Die Frage ist jetzt, ob ich nur über einen schmalbandigen und sehr 
steilen Bandpass an die Linie im Spektrum heran komme, ob es vielleicht 
eine andere Möglichkeit gibt, die Referenzfrequenz und das Messsignal zu 
verbinden, um möglichst störfrei die Amplitude auswerten zu können? Die 
Banalste Idee, die ich hatte war die, nach der FFT des Referenzsignals 
das Spektrum nach dem Maximum zu durchsuchen, mir den Index zu merken 
und im Spektrum des Messsignals an gleicher Indexstelle die Amplitude 
auszuwerten. Ich weiß nur nicht, wie sicher das funktioniert. In einer 
Matlabsimulation sah das bisher ganz gut aus.

Was für die ganze Auswertung auch noch wichtig sein wird, ist ein guter 
SNR, um wie gewünscht über einen breiten Bereich die Amplitude bestimmen 
zu können. Da die Bandbreite, in der die zu untersuchende Spektrallinie 
befindet, ca. 10 bis 15 kHz groß ist, ist es hier schwierig einen tollen 
und steilflankigen Tiefpassfilter einzusetzen. Was unter Matlab 
augenschcheinlich ganz gute erfolge gebracht hat, war die 
Autokorrelation des Messsignals.

Vielleicht hat ja jemand ein paar hilfreiche Gedanken. Wenn noch Fragen 
offen sind, einfach stellen.

Schöne Grüße

von Detlef _. (detlef_a)


Lesenswert?

Das geht mit dem hier dargestellten Verfahren sehr gut:
Beitrag "Re: Phasenverschiebung messen (us Bereich)"

Du bestimmst damit die Frequenz, Amplitude und Phase des Sinus, geht 
auch gut in Rauschen.

Cheers
detlef

von A. M. (am85)


Lesenswert?

Hi

Danke für deine Antwort. Aus dem Code werde ich aber noch nicht ganz 
schlau. Magst du ihn mir erklären und vielleicht auch das Verfahren, das 
dahinter steckt, nennen?

von Detlef _. (detlef_a)


Lesenswert?

Das Verfahren habe ich erwähnt:

>>>>Verfahren. Dieses Verfahren hat Prony erfunden.

Hier nochmal mit mehr Kommentar:

clear
w=15.3*2*pi/128
sig = 1.34*sin(w*(0:127)+0.123);
n=length(sig);

% Hier habe ich ein Testsignal gebastelt.
% Frequenz, Amplitude will ich wiederfinden

% Die Differenzengleichung eines ungedämpften diskreten Systems lautet
%sig(n+1)=2*cos(w)*sig(n)-sig(n-1);

%Das läßt sich umstellen:
%sig(n-1)+sig(n+1)=2*cos(w)*sig(n);

% Der Faktor 2*cos(w) bildet also sig(n) auf sig(n-1)+sig(n+1) ab
% Diesen linearen Faktor suche ich jetzt

% Das ist die Summe
s1=sig(1:n-2)+sig(3:n);
% Das ist der zwischenliegende wert
s2=sig(2:n-1);

%Jetzt mit linearer Regression den Faktor bestimmen
% Regression s1 auf s2
M= [s2.' ones(length(s1),1)];
coff=inv(M'*M)*M'*s1.';

%Den Faktor in die Frequenz umrechnen
wn=acos(coff(1)/2);

% Dieser rotierende Zeiger hat Amplitude und Phase
% darauf nochmal lineare regression anwenden
M=[cos((0:n-1)*wn).' sin((0:n-1)*wn).'];
coff=inv(M'*M)*M'*sig.';

%fertig
cc=coff(2)+j*coff(1);
amp=abs(cc);
ph=angle(cc);

Probier das mit Deinen Signalen aus, das geht.

Cheers
Detlef

von Uwe (Gast)


Lesenswert?

Lockin Verstärker

von A. M. (am85)


Lesenswert?

Hi

Danke für die Kommentierung des Codes. Mir ist das Verfahren vollkommen 
unbekannt und deswegen ist es leider immer noch ein bisschen kniffelig 
hinter den Grundgedanken des Verfahrens zu steigen. Ich habe es mal mit 
meinem Signal ausprobiert, aber sobald ich additives Rauschen oder eine 
zweite Frequenz im Signal habe, kommt bei der Amplitude aber nur noch 
unsinniges raus.

Ist das von dir hier beschriebene Verfahren das gleich, wie im folgenden 
Link ab Seite 23?

http://www.siart.de/lehre/spektralschaetzung.pdf

Uwe schrieb:
> Lockin Verstärker

Den Lock-In Verstärker will ich gerade ersetzen. Die Frage ist, wie?! 
Und das am besten effizient und Ressourcensparend, da das ganze wie 
gesagt auf einem Cortex M3 laufen soll.

von Detlef _. (detlef_a)


Lesenswert?

Andre,

>>Ist das von dir hier beschriebene Verfahren das gleich, wie im folgenden

Das Verfahren verstehe ich nicht anhand des PDFs. So wie ich das 
beschrieben habe, geht es um EINE Frequenz. Prony geht auch mit mehreren 
Frequenzen, kann sein, dass das so in den Folien vorgestellt wird, 
erschließt sich mir aber nicht daraus.

>>aber sobald ich additives Rauschen

mail mal ein Datenfile.

Cheers
Detlef

von A. M. (am85)


Lesenswert?

Detlef _a schrieb:
>>>aber sobald ich additives Rauschen
>
> mail mal ein Datenfile.
1
clear;
2
3
Fs = 48000;
4
Ts = 1/Fs;
5
6
N = 2^12;
7
8
f1 = 1938;
9
f2 = 16000;
10
t = (0:N-1)*Ts;
11
df = Fs/N;
12
f = (1:N/2)*df;
13
14
LSD = 0.1;
15
noise = sqrt(LSD/Ts)*randn(1,length(t));
16
17
sig = sin(2*pi*f1*t) + sin(2*pi*f2*t) + 0.01*noise;

"sig" wäre jetzt ein typisches Beispiel. Zwei harmonische Schwinungen 
überlagert von breitbandigem Rauschen.

von Uwe (Gast)


Lesenswert?

André M. schrieb:
> der FFT des Referenzsignals
>
> das Spektrum nach dem Maximum zu durchsuchen, mir den Index zu merken
>
> und im Spektrum des Messsignals an gleicher Indexstelle die Amplitude
>
> auszuwerten. Ich weiß nur nicht, wie sicher das funktioniert.

Wird durchaus so gemacht, allerdings ist eine FFT genügender Feinheit 
recht aufwändig.

von Wolfgang (Gast)


Lesenswert?

Was war das früher (tm) doch einfach. Da hat man zwei 
Synchrongleichrichter für sin() und cos() genommen, jeweils einen 
Tiefpaß dahinter geschaltet und konnte dann aus den beiden Signalen 
Amplitude und Phase ablesen.

von Detlef _. (detlef_a)


Lesenswert?

Hi,

>>Was für die ganze Auswertung auch noch wichtig sein wird, ist ein guter
>>SNR,

Yo, stimmt. In Deinem geposteten Beispiel ist Signal und Rauschen ca. 
gleich groß, das ist kein guter SNR. Außerdem hast Du im Beispiel zwei 
Frequenzen, nicht eine wie oben dargelegt.

Ich hatte nicht richtig gelesen, dass Du die Frequenzen ja kennst. Dann 
geht die Bestimmung der Amplitude mit dem Goertzel-Verfahren so gut wie 
das miese SNR es zuläßt. Länger messen macht die Bestimmung dann besser. 
Der Goertzel als ungedämpftes IIR 2.Ordnung macht Dir ein schmalbandiges 
Filter auf Deiner Wunschfrequenz.

Code unten anbei.
Cheers
Detlef

clear;

Fs = 48000;
Ts = 1/Fs;

N = 2^12;

f1 = 1938;
f2 = 16000;
t = (0:N-1)*Ts;
df = Fs/N;
f = (1:N/2)*df;

LSD = 0.1;
noise = sqrt(LSD/Ts)*randn(1,length(t));

sig = 1.2345*sin(2*pi*f1*t) + 1.4567*sin(2*pi*f2*t) + 0.01*noise;
%sig = 1.234*sin(2*pi*f1*t) + 0.01*noise;

w=(2*pi*f1/Fs);

q1=0;
q2=0;

for(k=1:length(sig)-1)
    q0=2*cos(w)*q1-q2+sig(k);
    q2=q1;
    q1=q0;
end;

bb=((q1-q2*cos(w))+i*q2*sin(w));
amplitude=2*abs(bb(end))/length(sig)

von A. M. (am85)


Lesenswert?

Hi

Danke für die Antworten. Der Goertzel-Algorithmus macht einen guten 
Eindruck. Ich werde ihn für meine Zwecke testen.

Wenn vielleicht noch jemand gute Literaturquellen zum Thema Lock-In 
Verstärker hat oder eine sehr gute Onlinequlle kennt (habe schon selber 
gegooglt), würde ich mich darüber auch sehr freuen.

Schöne Grüße

von Wolfgang (Gast)


Lesenswert?

André M. schrieb:
> Wenn vielleicht noch jemand gute Literaturquellen zum Thema Lock-In
> Verstärker hat
Was suchst du denn an weiteren Infos? Hier steht doch schon mal ein 
Aufhänger:
http://de.wikipedia.org/wiki/Lock-in-Verst%C3%A4rker

Statt einer variablen Phasenverschiebung für das Referenzsignal kannst 
du die ganze Mimik auch zwei mal aufbauen, einmal mit fester 
Verschiebung 0° und einen zweiten Zweig mit fester Verschiebung 90°. 
Dann bekommst du auch die Phaseninformation.

von A. M. (am85)


Lesenswert?

Wolfgang schrieb:
> André M. schrieb:
>> Wenn vielleicht noch jemand gute Literaturquellen zum Thema Lock-In
>> Verstärker hat
> Was suchst du denn an weiteren Infos? Hier steht doch schon mal ein
> Aufhänger:
> http://de.wikipedia.org/wiki/Lock-in-Verst%C3%A4rker
>
> Statt einer variablen Phasenverschiebung für das Referenzsignal kannst
> du die ganze Mimik auch zwei mal aufbauen, einmal mit fester
> Verschiebung 0° und einen zweiten Zweig mit fester Verschiebung 90°.
> Dann bekommst du auch die Phaseninformation.

Danke für deine Antwort. Im Kern suche ich Informationen zur praktischen 
Realisierung eines Lock-In Verstärkers. Könntest du mir das Vorgehen mit 
den beiden festen Phasenverschiebungen und der darauß möglichen 
Bestimmung der realen Phasenverschiebung etwas ausführlicher erklären? 
Wie geht das genau?

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.