Этот пример показывает, как применить адаптивные фильтры к затуханию акустического шума через активное шумовое управление.
В активном шумовом управлении каждый пытается уменьшать объем распространения нежелательного шума через воздух с помощью электроакустической системы с помощью датчиков измерения, таких как микрофоны и вывести приводы, такие как громкоговорители. Шумовой сигнал обычно прибывает из некоторого устройства, такого как вращающаяся машина, так, чтобы было возможно измерить шум около своего источника. Цель активной шумовой системы управления состоит в том, чтобы произвести "антишумовое", которое ослабляет нежелательный шум в желаемой тихой области с помощью адаптивного фильтра. Эта проблема отличается от традиционного адаптивного подавления помех в этом: - желаемый сигнал ответа не может быть непосредственно измерен; только ослабленный сигнал доступен. - Активная шумовая система управления должна учесть вторичный ошибочный путь громкоговорителя к микрофону в своей адаптации.
Для получения дополнительной информации реализации на активных шумовых задачах управления смотрите С.М. Куо и Д.Р. Моргана, "Активные Шумовые Системы управления: Алгоритмы и Реализации 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'});
Здесь мы моделируем активную шумовую систему управления. Чтобы подчеркнуть различие, мы запускаем систему без активного шумового управления для первых 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