如何做一个频段?

时间:2016-11-23 08:07:22

标签: matlab audio frequency

在这段代码中,我正在对我的wav文件进行stft。这没有问题。一开始,我正在定义我的参数,之后使用我的wav文件,然后应用stft。基本上我正在做的是实时光谱分析。无论如何我的问题是,我如何成为一个频段?我希望我的信号在LOW / MEDIUM / HIGH中分开。我想保存我的矢量,低频段0-250赫兹,MEDIUM频段250-5000赫兹,高频段5-22.05k赫兹。如果你不理解,我建议你在Matlab中试用我的代码。只需要任何wav文件。顺便说一句,我的信号被绘制在变量" Yres"中。感谢任何解决方案!

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

1 个答案:

答案 0 :(得分:1)

这可能不是最好的答案!但这可能会帮助你开始做某事。您可以使用MATLAB的信号处理工具箱中的spectrogram()函数。

假设您有一个名为'' UnchainMyHeart.wav'(在您的情况下)有一个频道的音频文件。代码如下:

% 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和P1包含信号的STFT和功率谱密度(PSD),每个部分的时间间隔,其时间间隔的估计值包含在T1中。

对于您的问题,您正在寻找F1,这是一个以采样频率fs表示的周期频率矢量。例如:如果您的采样频率为48 kHz(fs)且nfft为1024,那么您将有513 [(1024/2)+1)个频率值,间隔为(fs / nfft)。即46.875。所以你的频率成分是0,46.875,46.875 * 2,......,46.875 * 512。由于奈奎斯特准则,您将获得的最大值为24 kHz。

现在,您可以轻松编写一个简单的例程来指定您所说的范围。可以在您的代码中使用相同的技术,这是stft的实现。我建议使用MATLAB的内置函数,除非你的问题需要实现。希望这可以帮助!

如果需要,我可以回答为什么选择STFT参数作为代码中包含的参数。