Невозможно устранить синусоиду с режекторным фильтром

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

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);

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

Я не знаком с вашим методом определения коэффициентов фильтра, но, глядя на частотную характеристику с помощью freqz(num,den, [], Fc), я вижу, что ваша частота режекции составляет около 800 Гц вместо требуемых 400 Гц, что предполагает, что вы ошибаетесь в 2 раза. в вашем Fn. Fn=F0/Fc вроде работает нормально.

rinkert 09.04.2019 20:55

Спасибо за помощь. На самом деле, если я сделаю так, как вы сказали, я получу значительное затухание синусоидальной волны, но это не устранит ее, и на высоких частотах я не слышу никакого затухания. Это нормально?

Kirchoff87 10.04.2019 11:50

Посмотрите на частотный состав вашего сигнала, как показано в моем ответе, это должно помочь вам определить, какие частоты вы удаляете.

rinkert 10.04.2019 14:33
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
3
234
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Посмотрите на пример ниже. Это помогает посмотреть на частотный состав вашего сигнала, используя 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 Гц, которые вы можете настроить с помощью коэффициента добротности при использовании iirnotch (синий сигнал — это fft исходного звука, оранжевый — это fft отфильтрованного сигнала).

Другие вопросы по теме