mikrocontroller.net

Forum: Digitale Signalverarbeitung / DSP Frequenzanalyse eines Analogen Signals


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: Jürgen (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

ich habe (s. Anhang) folgende Textdatei und möchte die Frequenz mittels 
MATLAB daraus ermitteln. Es sind gemessene Drücke (analoges Signal) über 
die Zeit. Ich habe alles mit # entfernt und die Datei separat (pr_1.txt) 
eingespeichert, um die Werte mit load laden zu können. Wenn ich es 
plotte, bekomme ich wie in Bild dargestellt ein sehr willkürliches 
Signal. Die Frequenzen sollen Theoretisch sich irgendwo im Bereich von 0 
bis 500 Hz befinden. Ich hatte die ersten Schritte mit FFT probiert:
>> load pr_1.txt;
>> Fs = 1000; %Abtastfrequenz
>> T = 1/Fs; %Periode
>> L = length(pr_1); %Länge vom Signal
>> FFT = fft(pr_1);
>> P2 = abs(FFT/L);
>> P1 = P2(1:L/2+1);
>> P1(2:end-1) = 2*P1(2:end-1);
>> f = Fs*(0:(L/2))/L;
>> plot(f,P1)

Was da raus kam, sah nicht annähernd dem aus, was ich erwartet hatte. 
Also habe ich die Funktion pwelch genutzt:

>> pwelch(pr_1,[],[],[],Fs)
Hier konnte einen Peak bei 300 Hz feststellen. Um das Signal zu glätten 
nutze ich Kaiser window von Matlab:
>> len = 2050;
>> h = kaiser(len,4.53);
>> pwelch(pr_1,h,[],len,Fs)
Die Peaks wurden bei mir bei 302 und 396 Hz angezeigt.

Jezt kommen meine Punkte, die mich interessieren:
1. Ist es überhaupt richtig, was ich mit Pwelch herausbekommen habe oder 
erzähle ich hier Mist?
2. Warum hat es mit FFT nicht so gut funktioniert wie mit Pwelch?
3. Ich verstehe noch nicht genau die Kaiser Window - Funktion. Lese mich 
aktuell in Matlab ein. Die Werte habe ich aus einer Frequenzanalyse aus 
einem Video entnommen.
4. Die x-Achse bei Pwelch variiert je nachdem welche Abtastfrequenz ich 
benutze. So ändert sich mein Wert je nach welcher Abtastfrequenz ich 
einsetze. Bei Fs=1000 habe ich 300 und 400 Hz Peaks, Bei Fs=500 habe ich 
entsprechend die Hälfte: 150 und 200 Hz Peaks. Wie genau muss die 
Abtastfrequenz definieren.

Liebe Grüße
Jürgen

Autor: Burkhard (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jürgen schrieb:
> FFT = fft(pr_1);

Deine FFT hat 50k plus eine Bin, Dein (300 Hz) Peak quetscht sich an den 
linken Rand des Graphen. Versuch es doch mal mit einer kleineren FFT, 
z.B. fft(pr_1, 1024) oder  beschränke die Abbildung auf die niedrigeren 
Frequenzen.

Autor: Jürgen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Um ehrlich zu sein, habe ich die fft(gr_5,1000) schon mal verringert. 
Auch auf 1024 Bereich. Dennoch befindet sich mein Peak bei 0 Hz, wenn 
ich dann reinzoome, komme ich vielleicht auf 8 Hz, aber das ist 
definitiv nicht richtig. Es sollte schon im 100-stelligem Bereich sein. 
Aus experimenteller Sicht erwarte ich etwas zwischen 100 und 300 Hz. 
Klar kann das variieren, aber niemals 8 Hz sein. Das ist zu niedrig. Ich 
versuche mich da einzulesen, aber irgendetwas missverstehe ich wohl. 
Mein Englisch ist auch nicht optimal um alles nachzuvollziehen auf der 
Matlab Seite.

Autor: Rezy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Moin,
also zunächst kannst du beim Kaiser-Fenster mal den 2. Parameter 
variieren. Der stellt die spektrale Breite der Hauptkeule und die Höhe 
der Nebenkeulen ein. Mach den Parameter mal etwas größer. Vielleicht 
hilft das schon, um mehr zu sehen.

Außerdem ist in deinem Signal auf jeden Fall ein Gleichanteil vorhanden. 
Das siehst du im Zeitbereich daran, dass es etwa um 2,826 schwingt. Das 
bedeutet auch, dass deine Frequenzanalyse ein Signal bei 0 Hz darstellt. 
Aufgrund der zeitlichen Limitierung des Signals und der deshalb 
notwendigen Fensterung verbreitert sich dieses nun spektral, weshalb du 
den langsamen Abfall siehst, der außerdem einiges überdeckt.

Ich glaube eine sinnvollere Fensterung (versuch mal beispielsweise 
kaiser(len, 20) oder kaiser(len, 30) oder ein hann() oder blackman() 
window) sollte dir schon mehr Einblick geben. Und wenn du das Spektrum 
selbst per FFT berechnest, dann solltest du danach logarithmisch plotten 
-> 20*log10(P1). Ansonsten siehst du kaum etwas.

> 1. Ist es überhaupt richtig, was ich mit Pwelch herausbekommen habe oder
> erzähle ich hier Mist?

Klar macht pwelch alles richtig, nur kommt es natürlich auf die 
Parameter an. Insbesondere natürlich auch auf das genutzte Fenster.

> 2. Warum hat es mit FFT nicht so gut funktioniert wie mit Pwelch?

Pwelch macht mehr als nur eine FFT. Das unterteilt die Daten in mehrere 
kleinere Blöcke, transformiert sie und mittelt. Mit deiner FFT kannst du 
ohne Mittelung ein ähnliches Ergebnis erreichen, pwelch schätzt das 
Leistungsdichtespektrum so aber genauer ab.

> 3. Ich verstehe noch nicht genau die Kaiser Window - Funktion. Lese mich
> aktuell in Matlab ein. Die Werte habe ich aus einer Frequenzanalyse aus
> einem Video entnommen.

Wenn du einen endlichen Datenblock transformierst hast du das Problem, 
dass du implizit eine Fensterung mit einem rect im Zeitbereich 
durchführst. Das bedeutet, dass du dein Signal mit einem si im 
Frequenzbereich faltest. Deshalb verwaschen sich die einzelnen 
Frequenzpeaks etwas und du kannst schlimmstenfalls gar nichts mehr 
erkennen. Deshalb gibt es aber auch die Fensterfunktionen, die es 
ermöglichen, die Funktion zur Faltung im Frequenzbereich besser 
anzupassen, sodass du wieder was siehst. In der Regel ist eine 
Fensterung des Signals also immer sinnvoll! (Außer in Spezialfällen).

> 4. Die x-Achse bei Pwelch variiert je nachdem welche Abtastfrequenz ich
> benutze. So ändert sich mein Wert je nach welcher Abtastfrequenz ich
> einsetze. Bei Fs=1000 habe ich 300 und 400 Hz Peaks, Bei Fs=500 habe ich
> entsprechend die Hälfte: 150 und 200 Hz Peaks. Wie genau muss die
> Abtastfrequenz definieren.

Du solltest die Abtastfrequenz, mit der du das Signal abgetastet hast, 
einsetzen. Bei einer FFT kannst du nur Daten bis zur halben 
Abtastfrequenz erfassen (Abtasttheorem). Das plottet pwelch dir auch.

Autor: Jürgen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Rezy schrieb:
> Du solltest die Abtastfrequenz, mit der du das Signal abgetastet hast,
> einsetzen. Bei einer FFT kannst du nur Daten bis zur halben
> Abtastfrequenz erfassen (Abtasttheorem). Das plottet pwelch dir auch.

Danke für die Antworten. Genau da habe ich mein Verständnisproblem. Die 
Werte mit denen das Signal aufgezeichnet worden in der Textdatei:
#  Anzahl Messwerte: 100000
#  Aufnahmerate [Hz]: 9997.4286613483
#  Messdauer [s]: 10.002572
#  Zeitintervall je Messpunkt [ms]: 0.10002572

Die Aufnahmerate liegt bei 9997 Hz. Heißt es, dass ich mit dieser auch 
abtasten soll? Aber dann werden die Werte statt ~300 und ~400 Hz bei 
~3000 und ~4000 Hz liegen. Oder tue ich es missverstehen?

Autor: Jürgen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jürgen schrieb:
> Die Aufnahmerate liegt bei 9997 Hz. Heißt es, dass ich mit dieser auch
> abtasten soll? Aber dann werden die Werte statt ~300 und ~400 Hz bei
> ~3000 und ~4000 Hz liegen. Oder tue ich es missverstehen?

Ich hatte es soweit verstanden, dass ich mit der doppelten Frequenz 
abtasten muss, wie das maximale Signal des analogen Signals. Dann müsste 
ich ja wenn f = 9997 Hz ist, dann mit fs = 2*f abtasten. Aber die 
geplotteten Werte sind dann sehr verwirrend. Wie schon oben erwähnt.

Autor: Jürgen (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Rezy schrieb:
> Und wenn du das Spektrum
> selbst per FFT berechnest, dann solltest du danach logarithmisch plotten
> -> 20*log10(P1)

Wow ich habe es jetzt logarithmisch geplottet:

>> plot(f,20*log10(P1))

Das sieht gut aus. Die Frage, ob es auch jetzt so alles Richtig ist. 
Kann ich jetzt sagen, dass es bei 300 Hz liegt? Ich entschuldige mich, 
dass ich es mehrmals nachfrage. Ich will nur sichergehen.

Autor: Rezy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jürgen schrieb:
> Wow ich habe es jetzt logarithmisch geplottet:
>
>>> plot(f,20*log10(P1))
>
> Das sieht gut aus. Die Frage, ob es auch jetzt so alles Richtig ist.
> Kann ich jetzt sagen, dass es bei 300 Hz liegt? Ich entschuldige mich,
> dass ich es mehrmals nachfrage. Ich will nur sichergehen.

Moin,

fast! Deine Abtastrate ist ja scheinbar laut file fs = 9997.4286613483 
Hz. Also ist die Skalierung der x-Achse nicht richtig. Du hast also 
offensichtlich Anteile bei 3 kHz, sowie wenn du genauer reinschaust auch 
etwas bei ~200(?) Hz und ~100(?) Hz, wobei der 3 kHz Ton überwiegt. 
Allerdings sind die Töne kaum sichtbar und entsprechend kaum vorhanden. 
Eigentlich besteht dein Signal also hauptsächlich aus Rauschen und den 
einzelnen Tönen sehr geringer Intensität.

Autor: Jürgen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jetzt macht es langsam einen Sinn. Die Abtastfrequenz ist vorgegeben, 
wie in meinem Beispiel die dazugehörige Aufnahmefrequenz. Jetzt muss ich 
genauer schauen welche Anteile ich habe. Eigentlich schade, dass die 
3kHz so überwiegen, da diese gar nicht gemessen werden sollten. 
Wahrscheinlich war dann das aufgenommene Signal einfach miserabel. Ich 
danke dir für die Hilfe. Wieder was dazugelernt.

Autor: Wolfgang (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jürgen schrieb:
> Ich hatte es soweit verstanden, dass ich mit der doppelten Frequenz
> abtasten muss, wie das maximale Signal des analogen Signals. Dann müsste
> ich ja wenn f = 9997 Hz ist, dann mit fs = 2*f abtasten.

Die Frequenz, mit der das Analogsignal abgetastet wurde, ist die in der 
Textdatei als "Aufnahmerate" angegebene Frequenz. Wie kommst du drauf, 
dass man da im Nachhinein noch einen Einfluss drauf haben könnte?

Autor: Jürgen (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Wolfgang schrieb:
> Wie kommst du drauf,
> dass man da im Nachhinein noch einen Einfluss drauf haben könnte?

Durch ein Missverständnis. Da die ausgegebene Peaks bei sehr hohen 
Frequenzen lagen. Und ich bisher noch nicht viel Erfahrung mit FFT von 
Matlab habe und generell mit Signalverarbeitung. Deswegen bin ich froh 
auf Leute hier zu treffen, die sich damit auskennen und mir zeigen, wo 
meine Fehler sind und worauf ich in der Zukunft achten sollte. In vielen 
Beispielen stand Fs einfach da ohne jegliche Erklärung. Es war 
anscheinend so trivial, dass man nicht erwähnen muss, dass es dir 
vorgegeben wird.

Ich muss jetzt nur noch schauen wie ich am Besten das Rauschen aus der 
FFT rausbekomme und das so schön wie bei pwelch plotten kann.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.