Я написал этот код, чтобы исключить синусоиду из аудиофайла.
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);
Фильтр вообще не устраняет синусоиду. Я пробовал другую реализацию режекторного фильтра, но все равно это не сработало. Не могли бы вы помочь мне найти, где ошибка? Спасибо за все ответы.
Спасибо за помощь. На самом деле, если я сделаю так, как вы сказали, я получу значительное затухание синусоидальной волны, но это не устранит ее, и на высоких частотах я не слышу никакого затухания. Это нормально?
Посмотрите на частотный состав вашего сигнала, как показано в моем ответе, это должно помочь вам определить, какие частоты вы удаляете.
Посмотрите на пример ниже. Это помогает посмотреть на частотный состав вашего сигнала, используя 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 Гц:
После фильтрации этот высокий пик явно исчез:
Но если внимательно посмотреть на частоты, вы увидите, что вы также фильтруете частоты около 400 Гц, которые вы можете настроить с помощью коэффициента добротности при использовании iirnotch
(синий сигнал — это fft исходного звука, оранжевый — это fft отфильтрованного сигнала).
Я не знаком с вашим методом определения коэффициентов фильтра, но, глядя на частотную характеристику с помощью
freqz(num,den, [], Fc)
, я вижу, что ваша частота режекции составляет около 800 Гц вместо требуемых 400 Гц, что предполагает, что вы ошибаетесь в 2 раза. в вашемFn
.Fn=F0/Fc
вроде работает нормально.