Удаление частоты из сигнала с FFT - PullRequest
0 голосов
/ 26 октября 2018

Я делаю 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 голосов
/ 05 декабря 2018

У меня нет вашего frase.wav файла, поэтому я сделал себе один с двумя частотами, 5 кГц и 15 кГц с частотой дискретизации 44100 Гц. Я считаю, что 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

...