WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

FFT Amplitudenskalierung passt nicht, Wav Signal

 

Broetchen93
Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 25.07.19
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 25.07.2019, 15:18     Titel: FFT Amplitudenskalierung passt nicht, Wav Signal
  Antworten mit Zitat      
Hallo zusammen, ich habe mit Hilfe von Matlab ein Wave File erstellt, welches ich wiederum bei Matlab einlesen möchte, um mir das Spektrum des Signals anzusehen. Das Signal besteht aus 6 Teilsignalen. Jedes Signal besteht wiederum aus zwei Frequenzen, die durch einen Chirp sozusagen "verbunden sind". Also in einer gewissen Zeit erhöht sich die Frequenz von z.B. 10Hz auf 50Hz. Jedes der 6 Teilsignale enthält dabei ein anderes Frequenzpärchen. Es ist mir außerdem möglich, die Amplituden der Teilsignale einzustellen.

Meine eingestellten Amplituden lauten: a0 = 1, a1 = 0.6, a2 = 0.5, a3 = 0.3, a4 = 0.7 a5 = 0.4

Der erzeugte Plot hängt an, sowie auch das Zeitsignal.
EDIT: Irgendwie kann ich das WAV File nicht hochladen


Jetzt meine Fragen, da ich wenig Erfahrung mit Signalverarbeitung habe:
Also erwarten würde ich, dass ich die Amplituden auch so in dem Spektrum wiederfinde, also dass dann z.B. das niedrigste Frequenzpärchen die Amplitude 1 aufweist.
Habe ich irgendwelche groben Fehler gemacht, sodass die Amplituden alle zu gering ausfallen, oder ist mir hier ein Verständnisfehler unterlaufen?

Um aus dem Wav - File das Zeitsignal auszulesen und dann das Spektrum zu erzeugen, habe ich folgenden Code entworfen:
Code:

[y, Fs] = audioread('Zeitsignal.wav');
ts = 1/Fs;  %sampleTime

%Zeilen und Spalten vertauschen für weitere Verarbeitung
y = y';

%Aufspalten der Zeitsignale
y0 = y(1,:);
y1 = y(2,:);
y2 = y(3,:);
y3 = y(4,:);
y4 = y(5,:);
y5 = y(6,:);

%Für jedes Teilsignal fft berechnen und den (Amplituden-)Betrag bilden
Y0 = fft(y0);
Y0 = abs(Y0);

Y1 = fft(y1);
Y1 = abs(Y1);

Y2 = fft(y2);
Y2 = abs(Y2);

Y3 = fft(y3);
Y3 = abs(Y3);

Y4 = fft(y4);
Y4 = abs(Y4);

Y5 = fft(y5);
Y5 = abs(Y5);

%Festlegen der sampleAnzahl
samplePoints = length(Y0);

%Amplitude durch Anzahl der Samples teilen
Y0 = Y0 / samplePoints;
Y1 = Y1 / samplePoints;
Y2 = Y2 / samplePoints;
Y3 = Y3 / samplePoints;
Y4 = Y4 / samplePoints;
Y5 = Y5 / samplePoints;

%Multiplikation der Amplitude *2, um gleich das einseitige Spektrum
%darzustellen
Y0 = Y0 * 2;
Y1 = Y1 * 2;
Y2 = Y2 * 2;
Y3 = Y3 * 2;
Y4 = Y4 * 2;
Y5 = Y5 * 2;

%Festlegen der Variable für den maximalen Darstellungsbereich (3100Hz)
newLength = 3100;

%Daten nur bis zum maximalen Darstellungsbereich relevant, deswegen
%Ersetzen der Arrays
Y0 = Y0(1, 1:newLength);
Y1 = Y1(1, 1:newLength);
Y2 = Y2(1, 1:newLength);
Y3 = Y3(1, 1:newLength);
Y4 = Y4(1, 1:newLength);
Y5 = Y5(1, 1:newLength);

%Frequenzvektor für Darstellung des einseitigen Spektrums
freq = freq(1, 1:newLength);

%Plot aller Teilspektren
plot (freq, Y0, freq, Y1, freq, Y2, freq, Y3, freq, Y4, freq, Y5);
 


Die Frequenzen, an denen die Peaks auftreten, passen perfekt, allerdings verstehe ich nicht, dass die Amplitude nicht passt.

EDIT2: Habe eben überprüft, ob die Amplituden der Teilsignale im Zeitsignal überhaupt passen. Die sind alle so, wie erwartet.

untitled.png
 Beschreibung:

Download
 Dateiname:  untitled.png
 Dateigröße:  48.86 KB
 Heruntergeladen:  316 mal
Private Nachricht senden Benutzer-Profile anzeigen


Broetchen93
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 25.07.19
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 26.07.2019, 09:10     Titel: Update zum Code
  Antworten mit Zitat      
Hier nochmal ein Update zum Code, habe irgendwie oben die Erstellung des Frequenzvektors vergessen. Ich konnte meinen Ursprünglichen Beitrag nicht bearbeiten.
Außerdem habe ich noch eine weitere Zeile hinzugefügt, die Rauschen enthält. Das Rauschen ist allerdings sehr gering, deswegen hat das wohl kaum einen Einfluss.

Code:

[y, Fs] = audioread('Zeitsignal.wav');
ts = 1/Fs;  %sampleTime
freq = linspace(0,44100,44101); %Frequenzvektor über gesamte Abtastfrequenz

%Zeilen und Spalten vertauschen für weitere Verarbeitung
y = y';
t = 0:ts:1;
%Aufspalten der Zeitsignale
y0 = y(1,:);
y1 = y(2,:);
y2 = y(3,:);
y3 = y(4,:);
y4 = y(5,:);
y5 = y(6,:);
y6 = y(7,:);

%Für jedes Teilsignal fft berechnen und den (Amplituden-)Betrag bilden
Y0 = fft(y0);
Y0 = abs(Y0);

Y1 = fft(y1);
Y1 = abs(Y1);

Y2 = fft(y2);
Y2 = abs(Y2);

Y3 = fft(y3);
Y3 = abs(Y3);

Y4 = fft(y4);
Y4 = abs(Y4);

Y5 = fft(y5);
Y5 = abs(Y5);

Y6 = fft(y6);
Y6 = abs(Y6);

%Festlegen der sampleAnzahl
samplePoints = length(Y0);

%Amplitude durch Anzahl der Samples teilen
Y0 = Y0 / samplePoints;
Y1 = Y1 / samplePoints;
Y2 = Y2 / samplePoints;
Y3 = Y3 / samplePoints;
Y4 = Y4 / samplePoints;
Y5 = Y5 / samplePoints;
Y6 = Y6 / samplePoints;

%Multiplikation der Amplitude *2, um gleich das einseitige Spektrum
%darzustellen
Y0 = Y0 * 2;
Y1 = Y1 * 2;
Y2 = Y2 * 2;
Y3 = Y3 * 2;
Y4 = Y4 * 2;
Y5 = Y5 * 2;
Y6 = Y6 * 2;

%Festlegen der Variable für den maximalen Darstellungsbereich (3100Hz)
newLength = 3100;

%Daten nur bis zum maximalen Darstellungsbereich relevant, deswegen
%Ersetzen der Arrays
Y0 = Y0(1, 1:newLength);
Y1 = Y1(1, 1:newLength);
Y2 = Y2(1, 1:newLength);
Y3 = Y3(1, 1:newLength);
Y4 = Y4(1, 1:newLength);
Y5 = Y5(1, 1:newLength);
Y6 = Y6(1, 1:newLength);

%Frequenzvektor für Darstellung des einseitigen Spektrums
freq = freq(1, 1:newLength);

%Plot aller Teilspektren
plot (freq, Y0, freq, Y1, freq, Y2, freq, Y3, freq, Y4, freq, Y5, freq, Y6);
% plot (freq, Y6);
% plot(t,y);
grid on;
 
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum posten
Du kannst Dateien in diesem Forum herunterladen
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2024 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.