Forum: Digitale Signalverarbeitung / DSP / Machine Learning FFT nur in einem bestimmten Frequenzbereich


von Kai Z. (liquidsteel)


Lesenswert?

Moin,

ich sitze immer noch an meinem Frequenzanalyse-Projekt. Es geht darum 
die Freuqenz eines Eingangssignals hochgenau zu bestimmen. Letztes Jahr 
griff ich die Methode von Detlef auf, bei der man durch die 
Phasendrehung zweier ueberlappender FFTs die genaue Frequenz eines 
Signals errechnen kann. Dies funktionier auch SUPER!
Bei einer FFT Aufloesung von ca. 20 kHz (10MSPS, 1024 Punkte Complex 
FFT) kann ich die Frequenz des Signals promille-Genau, sogar noch 
exakter bestimmen.
Mein Eingangssignal hat immer eine dominierende Frequenz, die mal 
staerker und mal schwaecher zu sehen ist, also mit dynamischer 
amplitude. Dieser Frequenz moechte ich folgen (die frequenz "springt" 
nicht). Bislang habe ich jede FFT im vollen Frequenzbereich analysiert 
(800Hz bis 5MHz). Theoretisch brauche ich die Analyse im vollen 
Frequenzbereich nur einmal zu machen, den sobal die Frequenz (im falle 
der FFT, das Maximum) einmal gefunden ist, brauche ich dieser nur zu 
folgen. Zwischen 2 FFTs die ich durchfuehre, kann sich das Signal 
sowieso nur um maximal ca. 20 kHz verschoben haben. Es ist also alles 
andere als effizient jedesmal den gesamten Frequenzbereich von 5 MHz zu 
analysieren, obwohl man vorher weiss, dass sich das Signal z.b. bei 160 
kHz plus-minus 20 kHz befindet.
Ich habe schon stichwoerter wie Modulation der Samples aufgegriffen, 
aber so wirklich blicke ich da noch nicht ganz durch. Ein Beispiel 
konnte ich auch nicht finden.
Es geht also darum, dass ich eine FFT in einem bestimmten 
Frequenzbereich durchfuehren moechte, also z.B. zwischen 160kHz und 
200kHz. Meine Samplingrate betraegt 10MHz.
Fuer jede Hilfe waere ich sehr dankbar

Kai

von Hans M. (hansilein)


Lesenswert?


von Kai Z. (liquidsteel)


Lesenswert?

Danke!
Ich werde das mal testen.

von Kai Z. (liquidsteel)


Lesenswert?

Nach einigen Simulation muss ich feststellen, dass ich nicht ganz hinter 
der beziehung von Sample Rate und Anzahl der Samples, die ich durch den 
Goertzel jage, durchblicke.
Im Inet findet man meist nur das Beispiel mit 8kHz samplingrate und 
N-Anzahl von 205. Kann mir vlt. jemand erklaeren warum ausgrechnet 205?

Ein reales Scenarion in meinem Projekt waere folgendes:
Sampling rate: 10MHz, zu untersuchende Bandbreite: 40kHz: start bei 
140kHz, ende bei 180kHz. Die Genauigkeit dich ich hierbei brauche liegt 
bei 10Hz Schritten.

Wenn ich eine Simulation bei diesem Scenario durchfuehre scheint es, als 
ich ein unheimlich hohes N (Anzahl an Samples) brauche um genau zu sein.

Kann mir jemand sagen was genau es aufsich hat mit der Samplingrate, 
Samples-Anzahl und Aufloesung beim Goertzel. Wenn es gleich wie bei 
einer FFT ist, dann kann ich den Goertzel fuer meinen Zweck vergessen.

von Detlef _a (Gast)


Lesenswert?

>>>>
Letztes Jahr griff ich die Methode von Detlef auf, bei der man durch die
Phasendrehung zweier ueberlappender FFTs die genaue Frequenz eines
Signals errechnen kann. Dies funktionier auch SUPER!
<<<<

:-)))

Ich bin erstaunlicherweise in der Lage dazuzulernen und die 
Frequenz(Amplituden-,Phasen-)bestimmung  geht besser so:

Beitrag "Frequenzlinie ausfiltern und deren Amplitude auswerten"

Dabei bekommt man für jedes neue sample eine 'ad hoc' Frequenz, das 
Verfahren ist hochgenau: Ich konnte damit mit meiner soundkarte mittels 
Doppler-Frequenzverschiebung Fingerbewegungen detektieren.

Bei Interesse gerne mehr, ich werbe hier schon lange für dieses 
wunderbare Verfahren.

Goertzel ist FFT auf einer Frequenz, Du gibst die Frequenz vor.

Cheers
Detlef

von Kai Z. (liquidsteel)


Lesenswert?

Danke, immer wieder erfreut von dir zu hören Detlef :) Klar bin ich an 
deinem verbesserten Verfahren interessiert und werde es so schnell wie 
möglich Testen :)

von Purzel (Gast)


Lesenswert?

Im Prinzip geht es viel einfacher. Das Signal wird in Quadratur mit 
einer Frequenz in der Naehe multipliziert und tiefgepasst. Dann muss man 
nur noch auswerten was die differenzfrequenz ist, und ob das Resultat 
links oder rechts herum dreht. Dann weiss man die genaue Frequenz. Ich 
wuerd's mit etwas unterhalb von 140kHz versuchen.

von Frank Fridolin Tinitus (Gast)


Lesenswert?

Könnte man der Aufklärung halber nochmals bitte kurz aufzeigen, was die 
Methode Detlef 1 war und worin der Unterschied zu Detlef 2 besteht?

Mir ist dieser Satz nicht verstaändlich:

Kai Zung schrieb:
> bei der man durch die
> Phasendrehung zweier ueberlappender FFTs die genaue Frequenz eines
> Signals errechnen kann.

Welche Phasendrehung?

War gfs das gemeint: "Phasendifferenz zwischen zwei Informationen aus 2 
FFTs derselben gesuchten Frequenz?"

Im Prinzip ist es ja so, dass die Phase - relativ zur Bezugsohase 0 der 
FFT - bei beiden FFT-Ausgaben konstant sein muss - von Fehlern 
abgesehen.

Wie ermittle ich daraus die Frequenz?

Ich bekomme doch immer eine Art Gaussverlauf der Frequenzen mit 2 
Maxima, die ein theoretisches Maximum einfassen.

Wie kommt man da von deren Phasen auf die nicht erwischte Idealfrequenz?

Und wie stellt man fest, dass sich die Frequenz nicht verändert hat 
sondern statisch ist?

Eine sich bewegende Frequenz würde ja auch ein Verschmierung bewirken.

von Detlef _. (detlef_a)


Lesenswert?

Hallo,

das Interesse an genauer Frequenzbestimmung freut mich.

Die erste Methode lief über verschobene FFTs:
Beitrag "Genaue Frequenzbestimmung nach FFT"

Die zweite Methode geht ohne FFTs:
Beitrag "Frequenzlinie ausfiltern und deren Amplitude auswerten"

>>>>>>>
Kai Zung schrieb:
> bei der man durch die
> Phasendrehung zweier ueberlappender FFTs die genaue Frequenz eines
> Signals errechnen kann.

Welche Phasendrehung?
<<<<<<<
Ist erklärt in der Beschreibung der ersten Methode: Du kennst die 
Phasendrehung einer einzelnen Spektrallinie für z.B. zwei Abtastwerte 
Verschiebung, daraus läßt sich die genaue Frequenz berechnen.

>>>>>>>>>>>>
Im Prinzip ist es ja so, dass die Phase - relativ zur Bezugsohase 0 der
FFT - bei beiden FFT-Ausgaben konstant sein muss - von Fehlern
abgesehen.
<<<<<<<<<<<<<
Nee, dem ist nicht so. Die Phase dreht für überlappende FFTs weiter.

Die ganze Nummer ist mit Sourcecode in 
Beitrag "Genaue Frequenzbestimmung nach FFT" vorhanden, da mal 
reinkucken.

Cheers
Detlef

von Kai Z. (liquidsteel)


Lesenswert?

so, bin wieder da. Hat bisschen gedauert, da ich speziell zum überprüfen 
der verschiedenen Methoden eine Anwendersoftware geschrieben habe.
Die Methode mit den überlappenden FFTs ist bereits implementiert und 
rein rechnerisch deckt es sich mit meinen reelen Messungen.
Auch bei schwierigen Signalverhältnissen liefert mir die FFT Methode bei 
bestimmung der Hauptfrequenz eine Genauigkeit im promille Bereich.
Bei der zweiten, hier erwähnten Methode von Detlef stoß ich noch auf 
paar Probleme, die hauptsächlich darauf zurückzuführen sind, dass ich 
kein guter theoretischer Mathematiker bin :).
Verstehe ich das richtig, dass man im Prinzip nur 3 Samples braucht um 
eine erste Frequenz zu berechnen? Was macht man denn, wenn man 512 hat? 
Die mathematischen defizite tauchen bei mir übrigens bei der linearen 
Regression auf.
Also im prinzip Blicke ich zwischen den zwei Hauptzeilen nicht ganz 
durch:

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

Also Detlef falls du mir da noch bisschen auf die Sprünge helfen 
könntest, wäre es echt super.

Gruß
Kai

von Detlef _. (detlef_a)


Lesenswert?

>>>>
Verstehe ich das richtig, dass man im Prinzip nur 3 Samples braucht um
eine erste Frequenz zu berechnen?
<<<<
Ja, das ist richtig, es reichen 3 samples um die Frequenz zu bestimmen

>>>Was macht man denn, wenn man 512 hat?

Gute Frage. Du nimmst mehr samples als die 3 nötigen um den Einfluß des 
Rauschens zu unterdrücken. Mit den 512 samples oder auch jeder anderen 
sampleanzahl bekommst du für die gesuchte Konstante ein überbestimmtes, 
lineares Gleichungssystem. Und seit dem grossen Gauss löst man das mit 
minimalem Fehler mittels linearer Regression.
Und das geht so:
Ax=y ist das lineare, überbestimmte Gleichungssystem in 
Matrixschreibweise.
Lösung mit minimalen Fehlerquadraten lautet:
A'*A*x=A'y , mit A' (A transponiert) von links vormultipliziert)
Lösung:
x=inv(A'*A)*A'*y
Das ist die Gleichung, die auch im Matlab script steht. Das ganze ist 
auch bei Wikipedia unter 'lineare Regression' und 'Methode der kleinsten 
Quadrate' ausführlich und (m.E.) etwas verwirrend beschrieben.

Hoffe, das geht so bei Dir.

math rulez!
Cheers
Detlef

von Kai Z. (liquidsteel)


Lesenswert?

Ich bin nach langem hin und her auf die Methode von Prony die Detlef 
vorgestellt hat zurueckgekommen.

Detlef schrieb:
> Anbei ein Matlab script, das die Frequenz, Amplitude und Phase eines
> gegebenen Sinus bestimmt. Das funktioniert auch gut unter Rauschen.

Wenn ich jedoch auch nur das geringste Rauschen hinzufuege, dann versagt 
die Methode (und das script) komplett.

Kannst du das bestaetigen Detlef?

von Detlef_A (Gast)


Lesenswert?

>>Kannst du das bestaetigen Detlef?

Hallo, nein, das kann ich nicht bestätigen, ich schrub ja, dass das gut 
in Rauschen funktioniert. Poste mal die Daten.

Cheers
Detlef

von Kai Z. (liquidsteel)


Lesenswert?

Hier das Script das ich aus [[Frequenzlinie ausfiltern und deren 
Amplitude auswerten]] uebernommen habe plus noise.
Fuehre ich das Script ohne noise aus --> Super!!
Script mit noise --> Autsch!!

clear;

Fs = 48000;
Ts = 1/Fs;

N = 512;

f1 = 1938;
t = (0:N-1)*Ts;

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

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

s1=sig(1:N-2)+sig(3:N);
s2=sig(2:N-1);

M= [s2.' ones(length(s1),1)];
coff=inv(M'*M)*M'*s1.';

%Den Faktor in die Frequenz umrechnen
wn=acos(coff(1)/2);
f_calc = wn * Fs / (2 * pi)
fehler = (f_calc - f1) / f1 * 100

von Tachen (Gast)


Lesenswert?

Sorry ich kenne mich in der Materie nicht richtig aus,aber konnte es 
daran liegen dass das Rauschen nicht Bandbegrenzt ist?

von Detlef _. (detlef_a)


Lesenswert?

Hallo Kai,

reduzier mal die Abtastrate auf 12kHz oder niedriger, dann geht es 
besser.

Hintergrund: Für hohe Überabtastraten ist der Term coff(1)/2 nahe an 1, 
und 'auf der Kuppe des Cosinus' wirkt sich ein Fehler stark aus.

Kennst Du die Frequenz ungefähr? Dann gibt's besseres!

Cheers
Detlef

clear;

Fs = 12000;
Ts = 1/Fs;

N = 512;

f1 = 1938;
t = (0:N-1)*Ts;

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

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

s1=sig(1:N-2)+sig(3:N);
s2=sig(2:N-1);

M= [s2.' ones(length(s1),1)];
coff=inv(M'*M)*M'*s1.'

%Den Faktor in die Frequenz umrechnen
coff(1)/2
wn=acos(coff(1)/2)
f_calc = wn * Fs / (2 * pi)
fehler = (f_calc - f1) / f1 * 100

10*log10((sig*sig')/(0.01*noise*0.01*noise'))

plot(s2,s1,'r.',s2,M*coff,'b.')

return

von Kai Z. (liquidsteel)


Lesenswert?

Danke fuer die Hilfe Detlef. OK, das sieht schon besser aus. Fuer meine 
Zwecke warscheinlich jedoch nicht sehr gut geeignet.
Ich sample mit 10 MHz und detektiere Frequenzen von 800 Hz bis 5 MHz. 
Das klappt mit der Methode der zwei verschobenen FFTs auch recht gut! 
Jedoch hoffe ich noch genauer zu sein und suche deshalb nach anderen 
Methoden.

Um deine Frage zu beantworten: fuer die entgueltige Frequenz bilde ich 
bislang aus 15 Werten, jeweils errechnet mit Methode der verschobenen 
FFTs, den Durchschnitt. Ich kann somit problemlos die Frequenz zuerst 
mit der einen Methode (FFT Verschiebung) errechnen und dann eine andere 
Methode zur exakteren auswertung zuziehen.
Somit Ja, ich kenne die Frequenz ungefaehr. Was schlaegst du vor?

von Detlef A (Gast)


Lesenswert?

Hi, wenn Du die Frequenz kennst modellierst Du ein System, das 
ungedämpft auf dieser Frequenz schwingt. Dessen Zustandsgrößen schätzt 
Du mit einem Kalman Schatzer. Die Phasendrift ist ein Maß für den 
Frequenzversatz zwischen Deinem Model und Deinem realen Signal.

Das hatte ich hier schon mal dargelegt:
Beitrag "Amplitude und Phase einer festen Frequenz bestimmen."

Das ist im Prinzip das gleiche als wenn Du Dein Signal vor der 
Frequenzbestimmung durch enen sehr schmalbandigen Bandpass schickst, der 
'ungefähr paßt'.

Ich habe die Frequenz nochmal anders bestimmt, und zwar mittels 
anlytischem Signal. Geht auch ganz gut.

Cheers
Detlef

clear;
Fs = 12000;
Ts = 1/Fs;
N = 512;
f1 = 1938;
t = (0:N-1)*Ts;
LSD = 0.01;
noise = sqrt(LSD/Ts)*randn(1,length(t));
sig = 1.2345*sin(2*pi*f1*t) + 1*0.01*noise;

% Frequenzbestimmung durch Bildung von analytischem Signal
sigc=hilbert(sig);
phdiff=angle(sigc(2:end)./sigc(1:end-1));
phdiffmean=mean(phdiff);
f_calc1=Fs*phdiffmean/2/pi
return

von Holzauge (Gast)


Lesenswert?

Kai Zung schrieb:
> Ich sample mit 10 MHz und detektiere Frequenzen von 800 Hz bis 5 MHz.
und das geht so nah an Nyquist heran?

von Kai Z. (liquidsteel)


Lesenswert?

Mit der Methode Genaue Frequenzbestimmung nach FFT funktionier es 
auch so nah an Nyquist super. Wenn das Signal einen grossen Noise Antei 
hat, wird es nah an Nyquist (und nah an Nyquist / 2) zwar bisschen 
ungenauer, jedoch spreche ich hier von Abweichungen unterhalb des 
Promille-Breichs.

von Unwissender (Gast)


Lesenswert?

Der Artikel ist leer!

von Kai Z. (liquidsteel)


Lesenswert?


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.