Создайте Составной Системный объект

В этом примере показано, как создать Систему object™ состоявший из других Системных объектов. В этом примере создайте фильтр мультиметки с помощью двух dsp.NotchPeakFilter Системные объекты. Фильтры мультиметки используются во многих приложениях. Примеры включают аудио фазовращатели и приложения, которые требуют удаления нескольких вмешивающихся тонов.

Создайте фильтр мультиметки

Создайте Системный объект Скользящего среднего значения (MATLAB), объясняет подробно, как записать Системный объект с помощью файла шаблона. В этом примере целый Системный объект обеспечивается для удобства в dspdemo.CompositeObj_MultiNotch. Чтобы просмотреть код MATLAB®, в командной строке, войдите:

edit dspdemo.CompositeObj_MultiNotch
dspdemo.CompositeObj_MultiNotch имеет пять публичных свойств. Публичные свойства доступны для каждого пользователя. Первое свойство, SampleRate, ненастраиваемое свойство. Ненастраиваемые свойства не могут измениться, когда фильтр заблокирован (после того, как вы используете step на фильтре). Остающиеся свойства, CenterFrequency1, CenterFrequency2, QualityFactor1, и QualityFactor2 управляйте настройками в двух фильтрах метки, содержавшихся в dspdemo.CompositeObj_MultiNotch. Эти четыре свойства являются настраиваемыми. Можно изменить значения этих свойств при потоковой передаче данных.

Настройте фильтры мультиметки

dspdemo.CompositeObj_MultiNotch использование dsp.NotchPeakFilter спроектировать два фильтра метки. Фильтры метки настраиваются в setupImpl метод.

methods (Access=protected)
        function setupImpl(obj,~)
            % Construct two notch filters with default values
            obj.NotchFilter1 = dsp.NotchPeakFilter(...
                'Specification', 'Quality factor and center frequency',...
                'CenterFrequency',400);
            obj.NotchFilter2 = dsp.NotchPeakFilter(...
                'Specification', 'Quality factor and center frequency',...
                'CenterFrequency',800);
        end
end

Содержите системные объекты как частные свойства

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

properties (Access=private)
        % This example class contains two notch filters (more can be added
        % in the same way)
        NotchFilter1  
        NotchFilter2  
end

Работа с зависимыми свойствами

SampleRate свойство, а также остающиеся четыре публичных свойств реализовано как зависимые свойства в этом примере. Каждый раз, когда вы присваиваете значение одному из зависимых свойств, значение установлено в соответствующем фильтре одно метки. Когда вы читаете одно из зависимых свойств, значение читается из соответствующего фильтра одно метки. Найдите следующий блок кода в dspdemo.CompositeObj_MultiNotch.

properties (Dependent)
        %CenterFrequency1 Center frequency of first notch
        %   Specify the first notch center frequency as a finite positive
        %   numeric scalar in Hertz. The default is 400 Hz. This property
        %   is tunable.
        CenterFrequency1;
        %QualityFactor1 Quality factor of first notch
        %   Specify the quality factor (Q factor) for the first notch
        %   filter. The default value is 5. This property is tunable.
        QualityFactor1;
        %CenterFrequency2 Center frequency of second notch
        %   Specify the second notch center frequency as a finite positive
        %   numeric scalar in Hertz. The default is 800 Hz. This property
        %   is tunable.
        CenterFrequency2;
        %QualityFactor2 Quality factor of second notch
        %   Specify the quality factor (Q factor) for the first notch
        %   filter. The default value is 5. This property is tunable.
        QualityFactor2;
end

Используйте фильтр мультиметки - инициализация

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

FrameSize = 1024;
AFR = dsp.AudioFileReader('guitar10min.ogg','SamplesPerFrame',FrameSize);
Fs  = AFR.SampleRate;

MNF = dspdemo.CompositeObj_MultiNotch('SampleRate',Fs);

TFE = dsp.TransferFunctionEstimator(...
    'FrequencyRange','onesided','SpectralAverages',5);
AP  = dsp.ArrayPlot('PlotType','Line','YLimits',[-85 15],...
    'SampleIncrement',Fs/FrameSize);
P   = audioDeviceWriter;

Используйте фильтр мультиметки - потоковая передача

Чтобы проиллюстрировать приспособляемость двух частот центра фильтра метки, варьируйтесь центральные частоты синусоидально по циклу. Стартовые центральные частоты составляют 500 и 2 000 Гц. Первая центральная частота колеблется в области значений [100, 900] Гц с частотой 0,2 Гц. Вторая центральная частота колеблется в области значений [1200, 2800] Гц с частотой 0,5 Гц. Поскольку CenterFrequency1 и CenterFrequency2 зависимые свойства, изменение их значений в цикле изменяет центральные частоты в двух фильтрах метки, содержавшихся в dspdemo.CompositeObj_MultiNotch. Чтобы визуализировать фильтр мультиметки, оцените и стройте передаточную функцию постоянно. Добротности остаются постоянными. Симуляция запускается в течение 20 секунд.

MNF.QualityFactor1 = .5; 
MNF.QualityFactor2 = 1;

f0 = 0.2; 
f1 = 0.5; 

k = 0;
tic,
while toc < 20 
    x = AFR();
    t = k*FrameSize/Fs;
    k = k+1;

    MNF.CenterFrequency1 =  500 + 400*sin(2*pi*f0*t);
    MNF.CenterFrequency2 = 2000 + 800*sin(2*pi*f1*t);
    CF1(k) = MNF.CenterFrequency1;
    CF2(k) = MNF.CenterFrequency2;
    
    y = MNF(x);
    
    H = TFE(x(:,1),y(:,1));
    magdB = 20*log10(abs(H));
    AP(magdB);
    P(y);
end

Выполните этот код, чтобы показать, как две частоты центра метки варьировались по симуляции.

subplot(2,1,1)
plot(CF1); 
title('Center Frequency 1');
ylabel('Notch CF (Hz)');
subplot(2,1,2)
plot(CF2);
title('Center Frequency 2');
ylabel('Notch CF (Hz)');
xlabel('Iteration')