首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何利用信号概念在MATLAB中隔离频率范围?

如何利用信号概念在MATLAB中隔离频率范围?
EN

Stack Overflow用户
提问于 2016-05-02 02:43:14
回答 1查看 571关注 0票数 2

我试图使用在信号分析中学到的概念来将特定的频率与声音文件隔离开来。我有一个简短的WAV文件,其中包括一个人说话,但也有其他噪音与未知的频率,以上和下面的期望信号。我有一个上限和下限的频率范围,应该包含部分的声音,我想。

我认为我应该能够做到这一点,而不用使用信号分析工具箱或黄油过滤器。

到目前为止,我有这样的代码,它绘制了信号的功率谱:

代码语言:javascript
复制
[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);

功率谱看起来如下:

我认为我应该能够使用我必须的东西来过滤我们的任何高于或低于我的已知范围,但我不知道如何开始这样做。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-05-02 09:57:50

要应用理想的带通滤波器,可以使用下面的代码。但是,请注意,如果信号不是周期性的,理想的滤波器可能不会产生最优的结果(参见wiki文章这里)。

代码语言:javascript
复制
%% 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));
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36974301

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档