В этом примере показано, как использовать фильтр RLS для извлечения полезной информации из шумного сигнала. Сигнал, несущий информацию, представляет собой синусоидальную волну, которая испорчена аддитивным белым гауссовым шумом.
Адаптивная система шумоподавления предполагает использование двух микрофонов. Первичный микрофон воспринимает шумный входной сигнал, в то время как вторичный микрофон принимает шум, который не коррелирует с сигналом, несущим информацию, но коррелирует с шумом, воспринимаемым первичным микрофоном.
Примечание.Этот пример эквивалентен модели Simulink ® rlsdemo.
Справка: С.Хайкин, «Адаптивная теория фильтров», 3-е издание, Прентис Холл, Нью-Джерси, 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. Шум, который повреждает синусоидальную волну, является низкочастотной отфильтрованной версией этого шума (коррелированной с ним). Сумма отфильтрованного шума и сигнала, несущего информацию, является требуемым сигналом для адаптивного фильтра.
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 для 1000 итераций. По мере схождения адаптивного фильтра отфильтрованный шум должен полностью вычитаться из «сигнал + шум». Также ошибка «e» должна содержать только исходный сигнал.
scope = timescope('TimeSpanSource','property','TimeSpan',1000, ... 'YLimits',[-2,2]); for k = 1:10 n = noiseSource(); % Noise s = signalSource(); d = lp(n) + s; [y,e] = rlsfilt(n,d); scope([s,e]); end release(scope);

График показывает сходимость отклика адаптивного фильтра к отклику фильтра FIR.
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]);
