gpt4 book ai didi

matlab - 如何使用信号概念在MATLAB中隔离频率范围?

转载 作者:行者123 更新时间:2023-12-02 22:38:31 25 4
gpt4 key购买 nike

我正在尝试使用从信号分析中学到的概念来将特定频率从声音文件中隔离出来。我有一个简短的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);

功率谱如下所示:

我认为我应该能够使用必须过滤掉超出已知范围的任何东西,但是我不确定如何开始这样做。

最佳答案

要应用理想的带通滤波器,可以使用以下代码。但是,请注意,如果您的信号不是周期性的,理想的滤波器可能不会产生最佳效果(请参阅Wiki文章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));

关于matlab - 如何使用信号概念在MATLAB中隔离频率范围?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36974301/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com