2016-05-02 8 views
1

私は信号分析で学んだ概念を使って、特定の周波数をサウンドファイルから分離しようとしています。私は話している人で構成されている短いWAVファイルを持っていますが、希望の信号の上下両方の未知の周波数を持つ他のノイズもあります。私は、希望の音の部分を含むべき周波数範囲の上限と下限を持っています。信号の概念を使用してMATLABで周波数範囲を分離する方法は?

信号解析ツールボックスやバターフィルタを使用しないと、これを実行できるはずです。

これまでのところ、私は、信号用のパワースペクトルをプロットし、このコードを持っている:

[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); 

パワースペクトルは次のようになります。

power spectrum

私は使用することができるはずだと思うの私は私の知られている範囲の上または下の何かをフィルタリングする必要がありますが、私はそれをやり始める方法がわかりません。

答えて

0

理想的なバンドパスフィルタを適用するには、以下のコードを使用します。ただし、信号が周期的でない場合、理想的なフィルタが最適な結果を生成しないことがあります(wiki記事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)); 
関連する問題