2016-11-26 18 views
0

タイトルが混乱している場合は、事前にお詫び申し上げます。基本的に、私はオーディオファイルを持っています。私は50msごとにSTFTを実行します。私のファイルは約11秒(10.8526秒)で、これはサウンドトラックから切り離されています。 Btw、私はSTFTのMatlabで組み込み関数を使用することはできません。私はそれがはるかに容易であることを認識しています。とにかく、コードを実行した後、50msごとにSTFTが実行され、画像がプロットされています。 今私は3つの異なるプロットでそれを分離したいと思います。最初のプロットでは、低い周波数(0-300Hz)、2番目のプロット中間周波数(300-5kHz)、最後のプロットでは高い周波数(5Khz-fs/2)です。 fs = 44100 - >以下のコードでさらに説明します。どのように私は今エリアを定義することができますか?3つの異なる周波数領域でオーディオファイルを分割する

%AUDIO-FILE 
%______________________________________________________ 
[y,fs]=audioread('UnchainMyHeart.wav'); 
% audioread = Reads Audio file 
% y = A vector, which contains the audio signal 
% fs = sample rate 
% 'UnchainMyHeart' = Audio file 
%______________________________________________________ 


% Paramter for the real-time spectral-analysis 
%______________________________________________________ 
NFA=2; 
% Every second picture is being plotted 
% Don't need every picture 
t_seg=0.05; 
%Length of the audio signal on which is a STFT performed 

fftlen = 4096; 
% Length of the FFT, frequency resolution 

TPF= 300; 
BPF= 5000; 
HPF= 22050; 
% Trying to define the frequencies areas 
% Isn't working right now 

LOW=((TPF*fftlen)/fs); 
MEDIUM=((BPF*fftlen)/fs); 
HIGH=((HPF*fftlen)/fs); 
% Contains the number of FFT points in the frequency 
%_______________________________________________________ 

segl =floor(t_seg*fs); 

windowshift=segl/2; 

window=hann(segl); 

window=window.'; 

si=1; 
% Start Index 

ei=segl; 
% End Index 

AOS= length(y)/windowshift - 1; 

f1=figure; 

f=0:1:fftlen-1; 
f=f/(fftlen-1)*fs; 

Ya=zeros(1,fftlen); 

n=0; 

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; 
    %Updates the graphical objects which are being plotted every 50ms 

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

ylim([-90 50]); 
title('Spektrum of audio signal'); 
xlabel('f(Hz)'); 
ylabel('dB'); 
grid on; 

end 

si=si+windowshift; 
% Updating Start Index  
ei=ei+windowshift; 
% Updating End index 

end 

答えて

0

私はあなたのオーディオファイルを持っていないとして、あなたのコードを実行することはできませんが、私は、概念的に説明しよう、と擬似コードを使用します。

周波数レンガ壁

あなただけのあなただけのレンガ壁のフィルタを使用することができ、視覚的目的のために周波数を分離したい場合。

フルシグナルのfftを実行します。周波数ベクトルを定義します。

SigFD = fft(signal); 
n = length(signal); % number of samples 
fs = 44100; % sampling rate 
deltaF = fs/n; % frequency resolution 
F = [0:floor(n/2)-1, -(floor(n/2)):-1]*deltaF; % frequency vector 

希望する周​​波数範囲に基づいて信号をスライスします。これは擬似コードの多くを考慮しなければならないので、私はあなたの波形上のコードをテストすることができません

lowF = 0; 
highF = 500; 
part1Range = abs(F)>lowF&abs(F)<highF; 
Fpart1 = F(part1Range); 
Sig1FD = SigFD(part1Range); 

注意!

関連する問題