用fft消除信号频率

时间:2018-10-26 14:07:01

标签: matlab fft frequency

我正在执行fft操作,以从声音文件中删除特定频率。

问题是,也许我是盲人,或者是什么,但是以某种方式我设法只从一侧消除了频率,而即使我将其归零,另一侧也没有消失。有人可以告诉我我的索引是否被错误使用?

这是我的代码:

[frase, fs] = audioread('frase.wav');
soundsc(frase, fs);
S_fft = fft(frase);
N = length(frase);
F = (0:(N-1))/N*fs;
figure, plot(F, abs(S_fft));

% Remove the ugly frequency
S = S_fft;
zero = zeros(size(S));
S(200:400) = zero(200:400);
S(end-2*310:end-310) = zero(end-2*310:end-310);
figure, plot(F, abs(S));

这里是得到的光谱:

So the peak, in the beginning, isn't going anywhere

1 个答案:

答案 0 :(得分:1)

我没有您的 frase.wav 文件,因此我以44100 Hz的采样率使自己成为两个频率分别为5 kHz和15 kHz的文件。我认为15 kHs是“丑陋的”,我要删除的那个。

我认为您将要删除的频率与这些频率的索引相混淆。

以下是建议的修复方法,使用find查找我要删除的频率的索引。

[frase, fs] = audioread('frase.wav');
soundsc(frase, fs);
S_fft= fft(frase);
N = length(frase);
F = (0:(N-1))/N*fs;
subplot(2, 1, 1); plot(F, abs(S_fft)); title('Before');

%% Identify Ugly Frequency
Fu = 15000;

%% Remove the Ugly Frequency
tol = 10; % Tolerance around the ugly frequency
indexes_p = find(F>Fu-tol & F<Fu+tol); % Find indexes of ugly frequency
indexes_n = find(F>(fs-Fu)-tol & F<(fs-Fu));
indexes = [indexes_p indexes_n];
S_fft(indexes) = 0;
subplot(2, 1, 2); plot(F, abs(S_fft)); title('After');

结果是

remove frequency