我正在尝试使用信号分析中学到的概念来隔离声音文件中的特定频率。我有一个简短的WAV文件,由一个人说话,但也有其他噪音,在所需信号的上方和下方都有未知频率。我有一个频率范围的上限和下限,应包含我想要的声音部分。
我认为我应该能够在不使用信号分析工具箱或黄油过滤器的情况下完成此操作。
到目前为止,我有这个代码,它绘制了信号的功率谱:
[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);
功率谱如下所示:
我想我应该能够使用我所拥有的东西来过滤我已知范围之上或之下的任何东西,但我不知道如何开始这样做。
答案 0 :(得分:0)
要应用理想的带通滤波器,您可以使用以下代码。但请注意,如果您的信号不是周期性的,理想滤波器可能无法产生最佳效果(请参阅维基文章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));