2016-05-02 9 views
1

Ich versuche, Konzepte aus der Signalanalyse zu verwenden, um eine bestimmte Frequenz aus einer Audiodatei zu isolieren. Ich habe eine kurze WAV-Datei, die aus einer sprechenden Person besteht, aber auch andere Geräusche mit unbekannten Frequenzen sowohl oberhalb als auch unterhalb des gewünschten Signals. Ich habe eine obere und untere Grenze für den Frequenzbereich, der den gewünschten Teil des Klangs enthalten sollte.Wie isoliert man einen Frequenzbereich in MATLAB mit Signalkonzepten?

Ich glaube, ich sollte dies tun können, ohne dass die Filtersignale Analyse-Toolbox oder die Butter zu verwenden.

so weit ich habe diesen Code, die das Leistungsspektrum für das Signal Plots:

[y, Fs] = audioread('filename.wav','double'); 
t = 1:1:length(y); 

y = transpose(y); 
a = ifft(y); 
a_k = abs([a((length(y)/2)+1:-1:2),a(1:1:(length(y)/2)+1)]); 
bar((-length(y)/2)+1:1:(length(y)/2),a_k); 

Das Leistungsspektrum wie folgt aussieht:

power spectrum

Ich glaube, ich sollte in der Lage sein zu verwenden, was ich alles über oder unter meinem bekannten Bereich filtern muss, aber ich bin mir nicht sicher, wie ich damit anfangen soll.

Antwort

0

Um ideale Bandpassfilter anwenden Sie den Code unten verwenden können. Beachten Sie jedoch, dass der ideale Filter möglicherweise nicht die optimalen Ergebnisse liefert, wenn Ihr Signal nicht periodisch ist (siehe den Wiki-Artikel here).

%% Initialisation 
Fs = 44100; 
t0 = 0; 
t1 = 1; 
t = t0 : 1/Fs : t1; 

f1 = 10; 
f2 = 40; 
y = 10*cos(2*pi*f1*t) + 20*sin(2*pi*f2*t); 

%% Cosine series 

true_fft = fft(y); 

nfft = length(y); 

% The number of unique points 
if mod(nfft, 2) == 0 
    num_pts = round(nfft/2) + 1; 
else 
    num_pts = ceil(nfft/2); 
end 

% The vector that contains only unique points 
fftT = true_fft(1 : num_pts); 

% The vector that contains the unique frequencies 
u_f = (0 : num_pts-1)*Fs/nfft; 

%% Filtered signal 

% Definition of the frequency band 
f_low = 5; 
f_high = 15; 

[~, idx_low] = min(abs(u_f - f_low)); 
[~, idx_high] = min(abs(u_f - f_high)); 

filtFFTT = fftT; 
filtFFTT([1: idx_low idx_high : end]) = 0; 

if mod(nfft, 2) == 0 
    filtFFTT = [filtFFTT conj(filtFFTT((end - 1) : -1 : 2))]; 
else 
    filtFFTT = [filtFFTT conj(filtFFTT(end : -1 : 2))]; 
end 


%% Data visualisation 
figure; 
plot(t, ifft(filtFFTT));