在这段代码中,我正在对我的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
答案 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参数作为代码中包含的参数。