В этом примере показов, как использовать RLS-фильтр для извлечения полезной информации из сигнала с шумом. Информационный сигнал является синусоидой, которая повреждается аддитивным белым гауссовым шумом.
Адаптивная система шумоподавления предполагает использование двух микрофонов. Первичный микрофон захватывает шумный входной сигнал, в то время как вторичный микрофон получает шум, который некоррелирован с информационным сигналом, несущим сигнал, но коррелирует с шумом, захваченным первичным микрофоном.
Примечание: Этот пример эквивалентен предоставленной модели Simulink ® 'rlsdemo'.
Ссылка: С.Хайкин, «Адаптивная теория фильтров», 3-е издание, Prentice Hall, N.J., 1996.
Модель иллюстрирует способность фильтра Adaptive 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]);
Шум, повреждающий информационный несущий сигнал, является отфильтрованной версией 'noise'. Инициализируйте фильтр, который работает от шума.
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);
График показывает сходимость адаптивного фильтра к отклику конечной импульсной характеристики.
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]);