Активное шумовое управление Используя фильтрованного-X КИХ LMS адаптивный фильтр

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

Активное шумовое управление

В активном шумовом управлении каждый пытается уменьшать объем распространения нежелательного шума через воздух с помощью электроакустической системы с помощью датчиков измерения, таких как микрофоны и вывести приводы, такие как громкоговорители. Шумовой сигнал обычно прибывает из некоторого устройства, такого как вращающаяся машина, так, чтобы было возможно измерить шум около своего источника. Цель активной шумовой системы управления состоит в том, чтобы произвести "антишумовое", которое ослабляет нежелательный шум в желаемой тихой области с помощью адаптивного фильтра. Эта проблема отличается от традиционного адаптивного подавления помех в этом: - желаемый сигнал ответа не может быть непосредственно измерен; только ослабленный сигнал доступен. - Активная шумовая система управления должна учесть вторичный ошибочный путь громкоговорителя к микрофону в своей адаптации.

Для получения дополнительной информации реализации на активных шумовых задачах управления смотрите С.М. Куо и Д.Р. Моргана, "Активные Шумовые Системы управления: Алгоритмы и Реализации DSP", Wiley-межнаука, Нью-Йорк, 1996.

Вторичный путь к распространению

Вторичный путь к распространению является путем антишумовые взятия с выходного громкоговорителя на ошибочный микрофон в тихой зоне. Следующие команды генерируют импульсную характеристику микрофона громкоговорителя к ошибке, которая является bandlimited к области значений 160 - 2000 Гц и с продолжительностью фильтра 0,1 секунд. Для этой активной шумовой задачи управления мы будем использовать частоту дискретизации 8 000 Гц.

Fs     = 8e3;  % 8 kHz
N      = 800;  % 800 samples@8 kHz = 0.1 seconds
Flow   = 160;  % Lower band-edge: 160 Hz
Fhigh  = 2000; % Upper band-edge: 2000 Hz
delayS = 7;
Ast    = 20;   % 20 dB stopband attenuation
Nfilt  = 8;    % Filter order

% Design bandpass filter to generate bandlimited impulse response
filtSpecs = fdesign.bandpass('N,Fst1,Fst2,Ast',Nfilt,Flow,Fhigh,Ast,Fs);
bandpass = design(filtSpecs,'cheby2','FilterStructure','df2tsos', ...
    'SystemObject',true);

% Filter noise to generate impulse response
secondaryPathCoeffsActual = bandpass([zeros(delayS,1); ...
                       log(0.99*rand(N-delayS,1)+0.01).* ...
                       sign(randn(N-delayS,1)).*exp(-0.01*(1:N-delayS)')]);
secondaryPathCoeffsActual = ...
    secondaryPathCoeffsActual/norm(secondaryPathCoeffsActual);

t = (1:N)/Fs;
plot(t,secondaryPathCoeffsActual,'b');
xlabel('Time [sec]');
ylabel('Coefficient value');
title('True Secondary Path Impulse Response');

Оценка вторичного пути к распространению

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

ntrS = 30000;
randomSignal = randn(ntrS,1); % Synthetic random signal to be played
secondaryPathGenerator = dsp.FIRFilter('Numerator',secondaryPathCoeffsActual.');
secondaryPathMeasured = secondaryPathGenerator(randomSignal) + ... % random signal propagated through secondary path
    0.01*randn(ntrS,1); % measurement noise at the microphone

Разработка вторичной оценки пути к распространению

Как правило, длина вторичной оценки фильтра пути не пока фактический вторичный путь и не должна быть для надлежащего контроля в большинстве случаев. Мы будем использовать вторичную длину фильтра пути 250 касаний, соответствуя длине импульсной характеристики 31 мс. В то время как любой адаптивный КИХ-алгоритм фильтрации мог использоваться с этой целью, нормированный LMS-алгоритм часто используется из-за его простоты и робастности. Графики выходных сигналов и сигналов ошибки показывают, что алгоритм сходится приблизительно после 10 000 итераций.

M = 250;
muS = 0.1;
secondaryPathEstimator = dsp.LMSFilter('Method','Normalized LMS','StepSize', muS, ...
    'Length', M);
[yS,eS,SecondaryPathCoeffsEst] = secondaryPathEstimator(randomSignal,secondaryPathMeasured);

n = 1:ntrS;
figure, plot(n,secondaryPathMeasured,n,yS,n,eS);
xlabel('Number of iterations');
ylabel('Signal value');
title('Secondary Identification Using the NLMS Adaptive Filter');
legend('Desired Signal','Output Signal','Error Signal');

Точность вторичной оценки пути

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

figure, plot(t,secondaryPathCoeffsActual, ...
    t(1:M),SecondaryPathCoeffsEst, ...
    t,[secondaryPathCoeffsActual(1:M)-SecondaryPathCoeffsEst(1:M); secondaryPathCoeffsActual(M+1:N)]);
xlabel('Time [sec]');
ylabel('Coefficient value');
title('Secondary Path Impulse Response Estimation');
legend('True','Estimated','Error');

Первичный путь к распространению

Путь к распространению шума, который будет отменен, может также быть охарактеризован линейным фильтром. Следующие команды генерируют импульсную характеристику микрофона входа к ошибке, которая является bandlimited к области значений 200 - 800 Гц и имеет продолжительность фильтра 0,1 секунд.

delayW = 15;
Flow   = 200; % Lower band-edge: 200 Hz
Fhigh  = 800; % Upper band-edge: 800 Hz
Ast    = 20;  % 20 dB stopband attenuation
Nfilt  = 10;  % Filter order

% Design bandpass filter to generate bandlimited impulse response
filtSpecs2 = fdesign.bandpass('N,Fst1,Fst2,Ast',Nfilt,Flow,Fhigh,Ast,Fs);
bandpass2 = design(filtSpecs2,'cheby2','FilterStructure','df2tsos', ...
    'SystemObject',true);

% Filter noise to generate impulse response
primaryPathCoeffs = bandpass2([zeros(delayW,1); log(0.99*rand(N-delayW,1)+0.01).* ...
    sign(randn(N-delayW,1)).*exp(-0.01*(1:N-delayW)')]);
primaryPathCoeffs = primaryPathCoeffs/norm(primaryPathCoeffs);

figure, plot(t,primaryPathCoeffs,'b');
xlabel('Time [sec]');
ylabel('Coefficient value');
title('Primary Path Impulse Response');

Шум, который будет отменен

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

Инициализация активного шумового управления

Самым популярным адаптивным алгоритмом для активного шумового управления является отфильтрованный-X LMS-алгоритм. Этот алгоритм использует вторичную оценку пути, чтобы вычислить выходной сигнал, вклад которого в ошибочном датчике пагубно вмешивается в нежелательный шум. Опорный сигнал является шумной версией нежелательного звука, измеренного около его источника. Мы будем использовать длину фильтра контроллера приблизительно 44 мс и размер шага 0,0001 для этих статистических данных сигнала.

% FIR Filter to be used to model primary propagation path
primaryPathGenerator = dsp.FIRFilter('Numerator',primaryPathCoeffs.');

% Filtered-X LMS adaptive filter to control the noise
L = 350;
muW = 0.0001;
noiseController = dsp.FilteredXLMSFilter('Length',L,'StepSize',muW, ...
    'SecondaryPathCoefficients',SecondaryPathCoeffsEst);

% Sine wave generator to synthetically create the noise
A = [.01 .01 .02 .2 .3 .4 .3 .2 .1 .07 .02 .01];
La = length(A);
F0 = 60;
k = 1:La;
F = F0*k;
phase = rand(1,La); % Random initial phase
sine = audioOscillator('NumTones', La, 'Amplitude',A,'Frequency',F, ...
    'PhaseOffset',phase,'SamplesPerFrame',512,'SampleRate',Fs);

% Audio player to play noise before and after cancellation
player = audioDeviceWriter('SampleRate',Fs);

% Spectrum analyzer to show original and attenuated noise
scope = dsp.SpectrumAnalyzer('SampleRate',Fs,'OverlapPercent',80, ...
    'SpectralAverages',20,'PlotAsTwoSidedSpectrum',false, ...
    'ShowLegend',true, ...
    'ChannelNames', {'Original noisy signal', 'Attenuated noise'});

Симуляция активного шумового управления Используя фильтрованный-X LMS-алгоритм

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

Если адаптивный фильтр включен, получившийся алгоритм сходится приблизительно после 5 (симулированных) секунд адаптации. Сравнивание спектра остаточной ошибки сигнализирует с тем из исходного шумового сигнала, мы видим, что большинство периодических компонентов было значительно ослаблено. Установившаяся эффективность отмены не может быть универсальной через все частоты, как бы то ни было. Такой часто имеет место для реальных систем, применился к активным шумовым задачам управления. Слушая сигнал ошибки, раздражающее "хныканье" значительно уменьшается.

for m = 1:400
    % Generate synthetic noise by adding sine waves with random phase
    x = sine();
    d = primaryPathGenerator(x) + ...  % Propagate noise through primary path
        0.1*randn(size(x)); % Add measurement noise
    if m <= 200
        % No noise control for first 200 iterations
        e = d;
    else
        % Enable active noise control after 200 iterations
        xhat = x + 0.1*randn(size(x));
        [y,e] = noiseController(xhat,d);
    end
    player(e);     % Play noise signal
    scope([d,e]); % Show spectrum of original (Channel 1)
                     % and attenuated noise (Channel 2)
end
release(player); % Release audio device
release(scope); % Release spectrum analyzer