2016-11-26 11 views
0

Приносим извинения заранее, если заголовок вводит в заблуждение. В принципе, у меня есть Audio-файл, на котором я выполняю STFT каждые 50 мс. Мой файл около 11 секунд (10.8526s), который я отключил от саундтрека. Btw, мне не разрешено использовать встроенную функцию в Matlab для STFT. Я знаю, что это намного проще. Во всяком случае, после запуска моего кода каждые 50 мс выполняется STFT, и изображение рисуется. Теперь я хочу разделить его на 3 разных сюжета. На первом графике у меня более низкие частоты (0-300 Гц), на вторых частотах срединной среды (300-5 кГц), а на последнем графике у меня высокие частоты (5 кГц-fs/2). fs = 44100 -> Дальнейшие пояснения ниже в коде. Как я могу определить области?Разделение аудиофайла в трех разных частотных областях

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

Обратите внимание, что я не могу проверить код на осциллограмме таким образом, это следует рассматривать более псевдокод!