2016-11-23 2 views
1

Hier in diesem Code stehe ich auf meiner wav-Datei. Es gibt kein Problem damit. Am Anfang definiere ich meinen Parameter, benutze danach meine wav-Datei und verwende dann den Befehl stft. Im Grunde mache ich eine Echtzeit-Spektralanalyse. Wie auch immer, meine Frage ist, wie mache ich eine Frequenzband? Ich möchte, dass mein Signal in LOW/MEDIUM/HIGH getrennt wird. Ich möchte, dass mein Vektor gespeichert wird, von 0-250 Hz im LOW-Band, 250-5000 Hz im MEDIUM-Band, 5-22,05 kHz im HIGH-Band. Ich rate dir, meinen Code in Matlab auszuprobieren, wenn du es nicht verstehst. Nimm einfach irgendeine wav-Datei. Übrigens ist mein Signal in der Variablen "Yres" aufgetragen. Jede Lösung wird geschätzt!Wie mache ich ein Frequenzband?

NFA=2; % Number is used for plotting every 2nd picture 
t_seg=0.05; % Length of segment in ms 

fftlen = 4096; 
% Lenght of "fft",because our segment contains 2205 points 

[y,fs]=audioread('UnchainMyHeart.wav'); 
% audioread = functions reads WAV-file 
% y = A vector which contains my audio signal 
% fs = sample frequency (44100) 
% 'UnchainMyHeart' = WAV-file 

t=linspace(0,length(y)/fs,length(y)); 
% linspace = Creating time vector 
% 0 = Start time 
% length(y)/fs = End time 
% length(y) = Number of samples in y 

plot(t,y) 
% plotting signal in the time domain 


segl =floor(t_seg*fs); 
% Applying fft function on the variable "segl" 

windowshift=segl/2; 
% Defining the size of the window, which goes to the next "segl" 


window=hann(segl); 
% hann function 

window=window.'; 

si=1; 
%Start index 

ei=segl; 
%End index 

AOS= length(y)/windowshift - 1; 
% AOS is the number of "segl" we use (About 433) 

f1=figure; 
% Opening new window 

f=0:1:fftlen-1; 
f=f/(fftlen-1)*fs; 
% Defining frequency vector 

Ya=zeros(1,fftlen); 

plot(f,Ya),axis([0 fs -90 50]) 

grid on 

n=0; 
%start variable 

for m= 1:1:AOS 


y_a = y(si:ei); 
y_a= y_a.*window; 
Ya=fft(y_a, fftlen); 

n=n+1; 
if n==1 
    Yres=abs(Ya); 
    else 
    Yres=Yres+abs(Ya); 
end 

if n==NFA 
    Yres=Yres/NFA; 
    n=0; 

    drawnow; 
    %Tut die Grafikobjekte immer auf den neuesten Stand updaten 

figure(f1); 
plot(f(1:end/2), 20*log10(abs(Yres(1:end/2)))); 


ylim([-90 50]); 
title('Spektrum eines Audiosignal');  
xlabel('f(Hz)'); 
ylabel('dB'); 

grid on; 

end 


si=si+windowshift; 
% Updating start index 

ei=ei+windowshift; 
% Updating end index 

end 

Antwort

1

Dies ist möglicherweise nicht die beste Antwort! Aber das kann Ihnen helfen, mit etwas anzufangen. Sie können die Funktion spektrogramm() aus MATLABs Signal Processing Toolbox verwenden.

Nehmen wir an, Sie haben eine Audiodatei namens "UnchainMyHeart.wav" (in Ihrem Fall) mit einem Kanal. Der Code lautet wie folgt:

% Reading the audio file 
[y1,fs] = audioread('UnchainMyHeart.wav'); 

% Parameters for STFT (or spectrogram) 
windowDuration = 30e-3; overlapDuration = 15e-3; 
windowLength = round(windowDuration*fs); % window length 
overlapLength = round(overlapDuration*fs); % overlapping of windows 
nfft = 1024; 

% Executing STFT for the signal 
[S1,F1,T1,P1] = spectrogram(x1,hanning(windowLength), ... 
overlapLength, nfft, fs, 'yaxis'); 

S1 und P1 enthalten STFT und Leistungsspektrumsdichte (PSD) des Signals für ein Zeitintervall von jedem Abschnitt mit einem Zeitintervall, deren Schätzungen werden in T1 enthalten.

Für Ihre Frage, Sie suchen nach F1, die ein Vektor der zyklischen Frequenzen ausgedrückt in Bezug auf Abtastfrequenz, fs ist. Zum Beispiel: Wenn Sie eine Sampling-Frequenz von 48 kHz (fs) und nfft von 1024 haben, dann haben Sie 513 [(1024/2) +1)] Frequenz-Werte im Abstand von (fs/nfft). d.h. 46,875. Ihre Frequenzkomponenten sind also 0, 46.875, 46.875 * 2, ..., 46.875 * 512. Das Maximum, das Sie haben werden, ist 24 kHz aufgrund des Nyquist-Kriteriums.

Jetzt können Sie einfach eine einfache Routine schreiben, die die Bereiche wie gesagt angibt. Dieselbe Technik kann in Ihrem Code verwendet werden, der eine Implementierung von stft ist. Ich würde empfehlen, die integrierte Funktion von MATLAB zu verwenden, es sei denn, Ihr Problem erfordert eine Implementierung. Hoffe das hilft!

Bei Bedarf kann ich beantworten, warum die Parameter für STFT so gewählt sind, wie sie im Code enthalten sind.

+0

Meine fs ist 44.1k.Ich denke ich verstehe, was du meinst. (Englisch ist nicht meine Muttersprache). Ich bin mir bewusst, dass es bereits eine eingebaute Funktion für das STFT gibt. Aber ich hätte erwähnen sollen, dass dies für ein Projekt ist und ich bin verpflichtet, den Code selbst zu machen, ohne die eingebaute Funktion zu benutzen. Ist es vielleicht möglich, wenn Sie mir zeigen/erklären, wie Sie den Bereich angeben? Ich bin ein bisschen beunruhigt, wie man es anwendet. –

+0

Dies ist ein häufiger Fall der Frequenzauflösung (funktioniert sowohl für fft als auch für ftft). Wenn Sie fs = 44,1 kHz haben, wird Ihre maximale Frequenz 22050 sein. –

+0

Wenn Sie fs = 44,1 kHz haben, wird die maximal erfasste Frequenz 22050 sein. Bei einer Frequenzauflösung von 4096 haben Sie Frequenzen von 44,1e3/4096 = 10.7666 & 2049 Werte in STFT. Der Frequenzvektor lautet also: 0, 10.7666, 21.5332, 32.2998, ... 22050. In deinem Fall wird STFT (1:24) für Low-Band, STFT (25: 465) für Med-Band, der Rest ist für High-Band. Ich hoffe du verstehst es. STFT ist die Variable, in der Sie Ihren Ergebniswert speichern. –