Не удается устранить синусоиду с помощью режекторного фильтра - PullRequest
0 голосов
/ 09 апреля 2019

Я написал этот код, чтобы исключить синусоидальную волну из аудиофайла.

Fc = 40000;             %Sampling rate
F0 = 400;               %Notch frequency
Fs = Fc/2;              %Nyquist frequency
Fn = F0/Fs;             %Normalized frequency

r = 0.95;
num = [1 -2*cos(2*pi*Fn) 1];        % filter coefficients
den = [1 -2*r*cos(2*pi*Fn) r^2];    % filter coefficients

%Load original audio file
samples = [1, 5*Fc];
[clean_wav, Fc]=audioread('mustang.wav', samples);
originale_wav(:,2) = [];

%Add sine wave disturb
j = 1;
while j<(samples(2)+1),
  t(j) = j/Fc;
  j = j+1;
end; 
x=sin(2*pi*F0*t);
disturbed_wav = clean_wav' + x;

filtered_wav = filter(num,den, x);

soundsc(filtered_wav, Fc);

Фильтр не устраняет синусоидальную волну вообще. Я пробовал другую реализацию режекторного фильтра, но он все равно не работал. Не могли бы вы помочь мне найти ошибку? Спасибо за все ответы.

1 Ответ

1 голос
/ 10 апреля 2019

Посмотрите на пример ниже.Это помогает просматривать частоту вашего сигнала, используя fft до и после фильтрации.Затем вы можете четко представить, что происходит с вашим сигналом, какие частоты вы фильтруете.

% load a default sound
load handel.mat; % puts y and Fs in workspace
sound(y,Fs)

% Sample frequency and frequency to filter
%Fs = 8192; % from load handle.mat
F0 = 400; % frequency to filter

% time vector
t = (0:numel(y)-1).'/Fs;
% frequency vector for fft
f = 0:1/t(end):Fs;
% fft signal
Y = fft(y);

% add some sine wave with frequency F0 and small amplitude.
y_noise = y + 0.1*sin(2*pi*F0*t);

% listen to the sound
sound(y_noise, Fs)

% look at difference frequency content y and y_noise
Yn = fft(y_noise);

figure(2); clf;
plot(f,abs(Y),f,abs(Yn))


% filter
Wn = F0./Fs*2;
Q = 35;
[b,a] = iirnotch(Wn,Wn/Q);
y_filt = filter(b,a,y_noise);

% look at frequency response notch filter
freqz(b,a,[],Fs)

% fft to show frequency content filtered signal
Y_filt = fft(y_filter);

figure(3); clf;
plot(f,abs(Y),f,abs(Y_filt))

Чтобы проиллюстрировать, вот частотное содержание сигнала, который я использовал, явно резкий пик при 400 Гц: fft y

После фильтрации этовысокий пик явно пропал:

fft y filter

Но если взглянуть ближе на частоты, вы можете увидеть, что вы также фильтруете частоты около 400 Гц, которые можно настроитьиспользование Q-фактора при использовании iirnotch (синий сигнал - это fft исходного звука, оранжевый - это fft отфильтрованного сигнала).

enter image description here

...