exponenta event banner

Усиление сигнала с помощью алгоритмов LMS и NLMS

Используя наименьший среднеквадратичный (LMS) и нормализованные алгоритмы LMS, извлекайте требуемый сигнал из искаженного шумом сигнала путем фильтрации шума. Оба этих алгоритма доступны с dsp.LMSFilter object™ системы.

Создание сигналов для адаптации

Требуемый сигнал (выходной сигнал процесса) представляет собой синусоиду с 1000 выборок на кадр.

sine = dsp.SineWave('Frequency',375,'SampleRate',8000,'SamplesPerFrame',1000)
sine = 
  dsp.SineWave with properties:

          Amplitude: 1
          Frequency: 375
        PhaseOffset: 0
      ComplexOutput: false
             Method: 'Trigonometric function'
         SampleRate: 8000
    SamplesPerFrame: 1000
     OutputDataType: 'double'

s = sine();

Для выполнения адаптации фильтру требуется два сигнала:

  • Опорный сигнал

  • Шумный сигнал, который содержит как требуемый сигнал, так и добавленную шумовую составляющую

Генерация шумового сигнала

Создание шумового сигнала с авторегрессионным шумом (определяется как v1). В авторегрессионном шуме шум в момент времени t зависит только от предыдущих значений и случайного возмущения.

v = 0.8*randn(sine.SamplesPerFrame,1); % Random noise part.
ar = [1,1/2];          % Autoregression coefficients.
ARfilt = dsp.IIRFilter('Numerator',1,'Denominator',ar)
ARfilt = 
  dsp.IIRFilter with properties:

            Structure: 'Direct form II transposed'
            Numerator: 1
          Denominator: [1 0.5000]
    InitialConditions: 0

  Show all properties

v1 = ARfilt(v);

Повреждение требуемого сигнала для создания шумного сигнала

Для генерации шумового сигнала, который содержит как требуемый сигнал, так и шум, добавьте шумовой сигнал. v1 к требуемому сигналу s. Испорченная шумом синусоида x является:

x = s + v1;

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

Создание опорного сигнала

Определение сигнала скользящего среднего v2 который коррелирует с v1. Сигнал v2 является опорным сигналом для этого примера.

ma = [1, -0.8, 0.4, -0.2];
MAfilt = dsp.FIRFilter('Numerator',ma)
MAfilt = 
  dsp.FIRFilter with properties:

            Structure: 'Direct form'
      NumeratorSource: 'Property'
            Numerator: [1 -0.8000 0.4000 -0.2000]
    InitialConditions: 0

  Show all properties

v2 = MAfilt(v);

Создание двух адаптивных фильтров

Два аналогичных адаптивных фильтра шестого порядка - LMS и NLMS - составляют основу этого примера. Задайте порядок как переменную в MATLAB™ и создайте фильтры.

L = 7;
lms = dsp.LMSFilter(L,'Method','LMS')
lms = 
  dsp.LMSFilter with properties:

                   Method: 'LMS'
                   Length: 7
           StepSizeSource: 'Property'
                 StepSize: 0.1000
            LeakageFactor: 1
        InitialConditions: 0
           AdaptInputPort: false
    WeightsResetInputPort: false
            WeightsOutput: 'Last'

  Show all properties

nlms = dsp.LMSFilter(L,'Method','Normalized LMS')
nlms = 
  dsp.LMSFilter with properties:

                   Method: 'Normalized LMS'
                   Length: 7
           StepSizeSource: 'Property'
                 StepSize: 0.1000
            LeakageFactor: 1
        InitialConditions: 0
           AdaptInputPort: false
    WeightsResetInputPort: false
            WeightsOutput: 'Last'

  Show all properties

Выберите размер шага

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

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

maxstep функция dsp.LMSFilter объект определяет максимальный размер шага, подходящий для каждого алгоритма адаптивного фильтра LMS, который гарантирует, что фильтр сходится к решению. Часто условное обозначение для размера шага представляет собой

[mumaxlms,mumaxmselms] = maxstep(lms,x)
mumaxlms = 0.2127
mumaxmselms = 0.1312
[mumaxnlms,mumaxmsenlms] = maxstep(nlms,x)
mumaxnlms = 2
mumaxmsenlms = 2

Установка размера шага адаптации фильтра

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

lms.StepSize  = mumaxmselms/30 
lms = 
  dsp.LMSFilter with properties:

                   Method: 'LMS'
                   Length: 7
           StepSizeSource: 'Property'
                 StepSize: 0.0044
            LeakageFactor: 1
        InitialConditions: 0
           AdaptInputPort: false
    WeightsResetInputPort: false
            WeightsOutput: 'Last'

  Show all properties

nlms.StepSize = mumaxmsenlms/20 
nlms = 
  dsp.LMSFilter with properties:

                   Method: 'Normalized LMS'
                   Length: 7
           StepSizeSource: 'Property'
                 StepSize: 0.1000
            LeakageFactor: 1
        InitialConditions: 0
           AdaptInputPort: false
    WeightsResetInputPort: false
            WeightsOutput: 'Last'

  Show all properties

Фильтр с адаптивными фильтрами

Вы настроили параметры адаптивных фильтров и теперь готовы фильтровать шумный сигнал. Опорный сигнал v2 является входом адаптивных фильтров. x - требуемый сигнал в данной конфигурации.

Через адаптацию, y, выход фильтров, пытается эмулировать x как можно ближе.

Поскольку v2 коррелирует только с шумовой составляющей v1 из x, она может только действительно эмулировать v1. Сигнал ошибки (желаемый x), минус фактический выходной сигнал y, составляет оценку части x, которая не коррелирована с v2-s, сигналом для извлечения из x.

[~,elms,wlms] = lms(v2,x);
[~,enlms,wnlms] = nlms(v2,x);

Вычислите оптимальное решение

Для сравнения вычислите оптимальный фильтр FIR Винера.

reset(MAfilt);
bw = firwiener(L-1,v2,x); % Optimal FIR Wiener filter
MAfilt = dsp.FIRFilter('Numerator',bw)
MAfilt = 
  dsp.FIRFilter with properties:

            Structure: 'Direct form'
      NumeratorSource: 'Property'
            Numerator: [1.0001 0.3060 0.1050 0.0482 0.1360 0.0959 0.0477]
    InitialConditions: 0

  Show all properties

yw = MAfilt(v2); % Estimate of x using Wiener filter
ew = x - yw; % Estimate of actual sinusoid

Постройте график результатов

Постройте график результирующей денозированной синусоиды для каждого фильтра - фильтра Винера, адаптивного фильтра LMS и адаптивного фильтра NLMS - для сравнения производительности различных методов.

n = (1:1000)';
plot(n(900:end),[ew(900:end), elms(900:end),enlms(900:end)])
legend('Wiener filter denoised sinusoid',...
    'LMS denoised sinusoid','NLMS denoised sinusoid')
xlabel('Time index (n)')
ylabel('Amplitude')

В качестве опорной точки включите шумный сигнал в график как пунктирную линию.

hold on
plot(n(900:end),x(900:end),'k:')
xlabel('Time index (n)')
ylabel('Amplitude')
hold off

Figure contains an axes. The axes contains 4 objects of type line. These objects represent Wiener filter denoised sinusoid, LMS denoised sinusoid, NLMS denoised sinusoid.

Сравнение окончательных коэффициентов

Наконец, сравните коэффициенты фильтра Винера с коэффициентами адаптивных фильтров. При адаптации адаптивные фильтры пытаются сходиться к коэффициентам Винера.

[bw.' wlms wnlms]
ans = 7×3

    1.0001    0.8644    0.9690
    0.3060    0.1198    0.2661
    0.1050   -0.0020    0.1226
    0.0482   -0.0046    0.1074
    0.1360    0.0680    0.2210
    0.0959    0.0214    0.1940
    0.0477    0.0292    0.1127

Сброс фильтра перед фильтрацией

Состояние внутреннего фильтра можно сбросить в любое время путем вызова reset на объекте фильтра.

Например, эти последовательные вызовы производят один и тот же выходной сигнал после сброса объекта.

[ylms,elms,wlms] = lms(v2,x);
[ynlms,enlms,wnlms] = nlms(v2,x);

Если объект фильтра не сбрасывается, фильтр использует конечные состояния и коэффициенты из предыдущего прогона в качестве начальных условий и набора данных для следующего прогона.

Исследование сходимости с помощью обучающих кривых

Для анализа сходимости адаптивных фильтров используйте обучающие кривые. Инструментарий предоставляет методы создания обучающих кривых, но для получения значительных результатов требуется несколько итераций эксперимента.

Эта демонстрация использует 25 примеров реализации шумных синусоид.

reset(ARfilt)
reset(sine);
release(sine);
n = (1:5000)';
sine.SamplesPerFrame = 5000
sine = 
  dsp.SineWave with properties:

          Amplitude: 1
          Frequency: 375
        PhaseOffset: 0
      ComplexOutput: false
             Method: 'Trigonometric function'
         SampleRate: 8000
    SamplesPerFrame: 5000
     OutputDataType: 'double'

s = sine();
nr = 25;
v = 0.8*randn(sine.SamplesPerFrame,nr);
ARfilt = dsp.IIRFilter('Numerator',1,'Denominator',ar)
ARfilt = 
  dsp.IIRFilter with properties:

            Structure: 'Direct form II transposed'
            Numerator: 1
          Denominator: [1 0.5000]
    InitialConditions: 0

  Show all properties

v1 = ARfilt(v);
x = repmat(s,1,nr) + v1;
reset(MAfilt);
MAfilt = dsp.FIRFilter('Numerator',ma)
MAfilt = 
  dsp.FIRFilter with properties:

            Structure: 'Direct form'
      NumeratorSource: 'Property'
            Numerator: [1 -0.8000 0.4000 -0.2000]
    InitialConditions: 0

  Show all properties

v2 = MAfilt(v);

Вычисление обучающих кривых

Теперь вычислите среднеквадратичную ошибку. Чтобы ускорить процесс, вычисляйте ошибку каждые 10 выборок.

Сначала сбросьте адаптивные фильтры, чтобы избежать использования уже вычисленных коэффициентов и сохраненных состояний. Затем постройте график обучающих кривых для адаптивных фильтров LMS и NLMS.

reset(lms);
reset(nlms);
M = 10; % Decimation factor
mselms = msesim(lms,v2,x,M);
msenlms = msesim(nlms,v2,x,M);
plot(1:M:n(end),mselms,'b',1:M:n(end),msenlms,'g')
legend('LMS learning curve','NLMS learning curve')
xlabel('Time index (n)')
ylabel('MSE')

Figure contains an axes. The axes contains 2 objects of type line. These objects represent LMS learning curve, NLMS learning curve.

На этом графике показаны расчетные обучающие кривые для адаптивных фильтров LMS и NLMS.

Вычисление теоретических обучающих кривых

Для алгоритмов LMS и NLMS функции панели инструментов помогают вычислить теоретические кривые обучения, а также минимальную среднеквадратичную ошибку (MMSE), избыточную среднеквадратичную ошибку (EMSE) и среднее значение коэффициентов.

Для вычисления кривых MATLAB может потребоваться некоторое время. Рисунок, показанный после отображения кода, отображает прогнозируемые и фактические кривые LMS.

reset(lms);
[mmselms,emselms,meanwlms,pmselms] = msepred(lms,v2,x,M);
x = 1:M:n(end);
y1 = mmselms*ones(500,1);
y2 = emselms*ones(500,1);
y3 = pmselms;
y4 = mselms;
plot(x,y1,'m',x,y2,'b',x,y3,'k',x,y4,'g')
legend('MMSE','EMSE','Predicted LMS learning curve',...
    'LMS learning curve')
xlabel('Time index (n)')
ylabel('MSE')

Figure contains an axes. The axes contains 4 objects of type line. These objects represent MMSE, EMSE, Predicted LMS learning curve, LMS learning curve.