Адаптивное подавление помех Используя адаптивную фильтрацию RLS

Этот пример показывает, как использовать фильтр RLS, чтобы извлечь полезную информацию от сигнала с шумом. Информационный сигнал переноса является синусоидой, которая повреждается аддитивным белым гауссовым шумом.

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

Примечание: Этот пример эквивалентен модели Simulink® 'rlsdemo' обеспеченный.

Ссылка: S.Haykin, "адаптивная теория фильтра", 3-й выпуск, Prentice Hall, Нью-Джерси, 1996.

Модель иллюстрирует способность Адаптивного фильтра RLS извлечь полезную информацию от сигнала с шумом.

priv_drawrlsdemo
axis off

Информационный сигнал переноса является синусоидой 0,055 циклов/выборок.

signal = sin(2*pi*0.055*(0:1000-1)');
signalSource = dsp.SignalSource(signal,'SamplesPerFrame',100,...
    'SignalEndAction','Cyclic repetition');

plot(0:199,signal(1:200));
grid; axis([0 200 -2 2]);
title('The information bearing signal');

Шум, взятый вторичным микрофоном, является входом для адаптивного фильтра RLS. Шум, который повреждает синусоиду, является отфильтрованной версией lowpass (коррелируемый к) этот шум. Сумма отфильтрованного шума и информационного сигнала переноса является желаемым сигналом для адаптивного фильтра.

nvar  = 1.0;                  % Noise variance
noise = randn(1000,1)*nvar;   % White noise
noiseSource = dsp.SignalSource(noise,'SamplesPerFrame',100,...
    'SignalEndAction','Cyclic repetition');

plot(0:999,noise);
title('Noise picked up by the secondary microphone');
grid; axis([0 1000 -4 4]);

Шум, повреждающий информационный сигнал переноса, является отфильтрованной версией 'шума'. Инициализируйте фильтр, который работает с шумом.

lp = dsp.FIRFilter('Numerator',fir1(31,0.5));% Low pass FIR filter

Установите и инициализируйте адаптивные параметры фильтра RLS и значения:

M      = 32;                 % Filter order
delta  = 0.1;                % Initial input covariance estimate
P0     = (1/delta)*eye(M,M); % Initial setting for the P matrix
rlsfilt = dsp.RLSFilter(M,'InitialInverseCovariance',P0);

Выполнение адаптивного фильтра RLS для 1 000 итераций. Когда адаптивный фильтр сходится, отфильтрованный шум должен быть полностью вычтен из "сигнала + шум". Также ошибка, 'e', должна содержать только исходный сигнал.

scope = dsp.TimeScope('TimeSpan',1000,'YLimits',[-2,2], ...
	                  'TimeSpanOverrunAction','Scroll');
for k = 1:10
    n = noiseSource(); % Noise
    s = signalSource();
    d = lp(n) + s;
    [y,e]  = rlsfilt(n,d);
    scope([s,e]);
end
release(scope);

График показывает сходимость адаптивного ответа фильтра на ответ КИХ-фильтра.

H  = abs(freqz(rlsfilt.Coefficients,1,64));
H1 = abs(freqz(lp.Numerator,1,64));

wf = linspace(0,1,64);

plot(wf,H,wf,H1);
xlabel('Normalized Frequency  (\times\pi rad/sample)');
ylabel('Magnitude');
legend('Adaptive Filter Response','Required Filter Response');
grid;
axis([0 1 0 2]);