exponenta event banner

dsp. FrequencyDomainFIRFilter

Фильтрация входного сигнала в частотной области

Описание

dsp.FrequencyDomainFIRFilter Система object™ реализует фильтрацию на основе частотной области с быстрым преобразованием Фурье (БПФ) для фильтрации потокового входного сигнала. Во временной области операция фильтрации включает свертку между входным сигналом и импульсной характеристикой фильтра с конечной импульсной характеристикой (КИХ). В частотной области операция фильтрации включает в себя умножение преобразования Фурье входного сигнала и преобразования Фурье импульсной характеристики. Фильтрация в частотной области эффективна, когда импульсная характеристика очень велика. Можно задать коэффициенты фильтра непосредственно в частотной области, задавNumeratorDomain кому 'Frequency'.

Этот объект использует методы overlap-save и overlap-add для выполнения фильтрации в частотной области. Для фильтров с большой длиной импульсной характеристики задержка, присущая этим двум методам, может быть значительной. Чтобы уменьшить эту задержку, dsp.FrequencyDomainFIRFilter объект разделяет импульсную характеристику на более короткие блоки и реализует методы наложения-сохранения и наложения на эти более короткие блоки. Чтобы разделить импульсную характеристику, задайте для свойства PartiveForReducedLatency значение true. Для получения более подробной информации об этих двух методах и об уменьшении задержек за счет секционирования импульсной характеристики см. раздел Алгоритмы.

Для фильтрации входного сигнала в частотной области:

  1. Создать dsp.FrequencyDomainFIRFilter и задайте его свойства.

  2. Вызовите объект с аргументами, как если бы это была функция.

Дополнительные сведения о работе системных объектов см. в разделе Что такое системные объекты?.

Создание

Описание

fdf = dsp.FrequencyDomainFIRFilter создает объект системы КИХ-фильтров частотной области, который фильтрует каждый канал входного сигнала независимо во времени в частотной области с использованием метода наложения-сохранения или наложения-сложения.

пример

fdf = dsp.FrequencyDomainFIRFilter(num) создает объект фильтра FIR частотной области со свойством Numerator, равным num.

Пример: dsp.FrequencyDomainFIRFilter(fir1(400,2 * 2000 / 8000));

пример

fdf = dsp.FrequencyDomainFIRFilter(Name,Value) создает системный объект FIR-фильтра частотной области с заданным значением каждого свойства. Заключите каждое имя свойства в отдельные кавычки. Этот синтаксис можно использовать с любыми предыдущими комбинациями входных аргументов.

Пример: dsp.FrequencyDomainFIRFilter('Method','Overlap-add');

Свойства

развернуть все

Если не указано иное, свойства не настраиваются, что означает невозможность изменения их значений после вызова объекта. Объекты блокируются при их вызове, и release функция разблокирует их.

Если свойство настраивается, его значение можно изменить в любое время.

Дополнительные сведения об изменении значений свойств см. в разделе Проектирование системы в MATLAB с использованием системных объектов.

Метод фильтра частотной области, указанный как 'Overlap-save' или 'Overlap-add'. Дополнительные сведения об этих двух методах см. в разделе Алгоритмы.

Область коэффициентов фильтра, заданная как один из следующих:

  • 'Time' -- Укажите числитель фильтра временной области в Numerator собственность.

  • 'Frequency' - Укажите частотную характеристику фильтра в FrequencyResponse собственность.

Коэффициенты КИХ-фильтра, заданные как вектор строки.

Настраиваемый: Да

Зависимости

Это свойство применяется, когда NumeratorDomain имеет значение 'Time'.

Типы данных: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64
Поддержка комплексного номера: Да

Частотная характеристика фильтра, заданная как вектор строки или матрица. Когда PartitionForReducedLatency является false, FrequencyResponse должен быть вектором строки. Длина БПФ равна длине FrequencyResponse вектор. Когда PartitionForReducedLatency является true, FrequencyResponse должен быть матрицей 2P-by-N, где P - размер секции, а N - количество секций.

Настраиваемый: Да

Зависимости

Это свойство применяется, когда NumeratorDomain имеет значение 'Frequency'.

Типы данных: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64
Поддержка комплексного номера: Да

Длина числителя временной области, заданная как скаляр с положительным целым числом.

Зависимости

Это свойство применяется, когда NumeratorDomain имеет значение 'Frequency' и PartitionForReducedLatency имеет значение false.

Типы данных: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

Флаг для указания, являются ли все коэффициенты фильтра действительными, указанный как true или false.

Зависимости

Это свойство применяется, когда NumeratorDomain имеет значение 'Frequency'.

Флажок к числителю секционирования для уменьшения задержки, указанный как одно из следующих значений:

  • false - Фильтр использует традиционный метод наложения-сохранения или наложения-добавления. Задержка в этом случае равна FFTLength - длина (числитель) + 1.

  • true -- В этом режиме объект разбивает числитель на сегменты длиной, заданной свойством PartureLength. Фильтр выполняет наложение-сохранение или наложение-добавление для каждой секции и объединяет частичные результаты для формирования общего результата. Теперь задержка уменьшается до длины раздела.

Длина БПФ, заданная как положительное целое число. Значение этого свойства по умолчанию, []указывает, что длина БПФ равна удвоенной длине числителя. Длина БПФ должна быть больше или равна длине числителя.

Пример: 64

Зависимости

Это свойство применяется при установке NumeratorDomain свойство для 'Time' и свойство PartityForReducedLatency для false.

Типы данных: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

Длина секции числителя, заданная как положительное целое число, меньшее или равное длине числителя.

Пример: 40

Пример: 60

Зависимости

Это свойство применяется при установке NumeratorDomain свойство для 'Time' и свойство PartityForReducedLatency для true.

Типы данных: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

Это свойство доступно только для чтения.

Задержка фильтра в выборках, возвращаемая как целое число больше 0. Если параметр PartureForReducedLatency имеет значение false, задержка равна FFTLength - длина (числитель) + 1. КогдаPartitionForReducedLatency является true, задержка равна длине раздела.

Типы данных: uint32

Использование

Синтаксис

Описание

пример

fdfOut = fdf(input) фильтрует входной сигнал и выводит отфильтрованный сигнал. Объект фильтрует каждый канал входного сигнала независимо во времени в частотной области.

Входные аргументы

развернуть все

Ввод данных, заданный как вектор или матрица. Этот объект поддерживает входные сигналы переменного размера. То есть изменить размер входного кадра (количество строк) можно даже после вызова алгоритма. Однако количество каналов (количество столбцов) должно оставаться постоянным.

Пример: randn(164,4)

Типы данных: single | double
Поддержка комплексного номера: Да

Выходные аргументы

развернуть все

Отфильтрованные выходные данные, возвращаемые в виде вектора или матрицы. Размер, тип данных и сложность выходных данных совпадают с размерами входных данных.

Типы данных: single | double
Поддержка комплексного номера: Да

Функции объекта

Чтобы использовать функцию объекта, укажите объект System в качестве первого входного аргумента. Например, для освобождения системных ресурсов объекта System с именем obj, используйте следующий синтаксис:

release(obj)

развернуть все

fvtoolВизуализация частотной характеристики фильтров DSP
stepЗапустить алгоритм объекта System
releaseДеблокирование ресурсов и разрешение изменений значений свойств объекта системы и входных признаков
resetСброс внутренних состояний объекта System

Примеры

свернуть все

Фильтрация входного сигнала с использованием методов наложения-сложения и наложения-сохранения и сравнение выходных сигналов с выходными данными КИХ-фильтра.

Инициализация

Проектирование коэффициентов фильтра нижних частот FIR с использованием fir1 функция. Частота дискретизации составляет 8 кГц, а частота отсечки фильтра - 2 кГц. Импульсная характеристика имеет длину 400.

impL    = 400;
Fs      = 8000;
Fcutoff = 2000;
imp     = fir1(impL,2*Fcutoff/Fs);

Создать два dsp.FrequencyDomainFIRFilter объекты и dsp.FIRFilter объект. Установите числитель всех трех фильтров в значение imp. Задержка выхода КИХ на задержку фильтра частотной области.

fdfOA = dsp.FrequencyDomainFIRFilter(imp,'Method','overlap-add');
fdfOS = dsp.FrequencyDomainFIRFilter(imp,'Method','overlap-save');
fir = dsp.FIRFilter('Numerator',imp);
dly = dsp.Delay('Length',fdfOA.Latency);

Создать два dsp.SineWave объекты. Генерируемые синусоидальные волны имеют частоту дискретизации 8000 Гц, размер кадра 256 и частоты 100 Гц и 3 кГц соответственно. Создать timescope для просмотра отфильтрованных выходных данных.

frameLen  = 256;

sin_100Hz = dsp.SineWave('Frequency',100,'SampleRate',Fs,...
    'SamplesPerFrame',frameLen);
sin_3KHz  = dsp.SineWave('Frequency',3e3,'SampleRate',Fs,...
    'SamplesPerFrame',frameLen);
ts = timescope('TimeSpanOverrunAction','Scroll',...
    'ShowGrid',true,'TimeSpanSource','Property','TimeSpan',5 * frameLen/Fs,...
    'YLimits',[-1.1 1.1],...
    'ShowLegend',true,...
    'SampleRate',Fs,...
    'ChannelNames',{'Overlap-add','Overlap-save','Direct-form FIR'});

Вытекание

Поток 1e4 кадров шумных входных данных. Передайте эти данные через фильтры частотной области и фильтр FIR. Просмотрите отфильтрованные выходные данные в области времени.

numFrames = 1e4;
for idx = 1:numFrames
    x = sin_100Hz() + sin_3KHz() + 0.01*randn(frameLen,1);
    yOA = fdfOA(x);
    yOS = fdfOS(x);
    yFIR = fir(dly(x));
    ts([yOA,yOS,yFIR]);
end

Выходы всех трех фильтров точно совпадают.

Разбиение длины импульсной характеристики КИХ-фильтра частотной области. Сравните выходные данные секционированного фильтра и исходного фильтра.

Проектирование коэффициентов фильтра нижних частот FIR с использованием fir1 функция. Частота дискретизации составляет 8 кГц, а частота отсечки фильтра - 2 кГц. Импульсная характеристика имеет длину 4000.

impL    = 4000;
Fs      = 8000;
Fcutoff = 2000;
imp     = fir1(impL,2 * Fcutoff / Fs);

Создать dsp.FrequencyDomainFIRFilter с коэффициентами, установленными на imp вектор. Задержка этого фильтра задается как, $FFT Length - Length(Numerator) + 1$что равно 4002. По умолчанию длина БПФ равна удвоенной длине числителя. Это делает задержку пропорциональной длине импульсной характеристики.

fdfOS  = dsp.FrequencyDomainFIRFilter(imp,'Method','overlap-save');
fprintf('Frequency domain filter latency is %d samples\n',fdfOS.Latency);
Frequency domain filter latency is 4002 samples

Разбиение импульсной характеристики на блоки длиной 256. Задержка после разбиения пропорциональна длине блока.

fdfRL  = dsp.FrequencyDomainFIRFilter(imp,'Method','overlap-save',...
    'PartitionForReducedLatency',true,...
    'PartitionLength',256);
fprintf('Frequency domain filter latency is %d samples\n',fdfRL.Latency);
Frequency domain filter latency is 256 samples

Сравните выходные сигналы двух фильтров частотной области. Задержка fdfOS равно 4002, и задержка fdfRL 256. Для сравнения двух выходов задерживайте ввод на fdfRL по 4002 - 256 образцов.

dly = dsp.Delay('Length',(fdfOS.Latency-fdfRL.Latency));

Создать два dsp.SineWave объекты. Синусоидальные волны имеют частоту дискретизации 8000 Гц, размер кадра 256 и частоты 100 Гц и 3 кГц соответственно. Создать timescope для просмотра отфильтрованных выходных данных.

frameLen  = 256;
sin_100Hz = dsp.SineWave('Frequency',100,'SampleRate',Fs,...
    'SamplesPerFrame',frameLen);
sin_3KHz  = dsp.SineWave('Frequency',3e3,'SampleRate',Fs,...
    'SamplesPerFrame',frameLen);
ts = timescope('TimeSpanOverrunAction','Scroll','ShowGrid',true,...
    'TimeSpanSource','Property','TimeSpan',5 * frameLen/Fs,...
    'YLimits',[-1.1 1.1],...
    'ShowLegend',true,...
    'SampleRate',Fs,...
    'ChannelNames',{'Overlap-save With Partition','Overlap-save Without Partition'});

Поток 1e4 кадров шумных входных данных. Передайте эти данные через два фильтра частотной области. Просмотрите отфильтрованные выходные данные в области времени.

numFrames = 1e4;
for idx = 1:numFrames
    x = sin_100Hz() + sin_3KHz() + .1 * randn(frameLen,1);
    yRL = fdfRL(dly(x));
    yOS = fdfOS(x);
    ts([yRL,yOS]);
end

Выходные данные точно совпадают.

Укажите числительные коэффициенты фильтра КИХ частотной области в частотной области. Фильтрация входного сигнала методом наложения-сложения. Сравните выходной сигнал КИХ-фильтра частотной области с соответствующим выходным сигналом КИХ-фильтра временной области.

Инициализация

Проектирование коэффициентов фильтра нижних частот FIR с использованием fir1 функция. Частота дискретизации составляет 8 кГц, а частота отсечки фильтра - 2 кГц. Импульсная характеристика временной области имеет длину 400. Вычислите БПФ этой импульсной характеристики и определите эту характеристику как частотную характеристику фильтра КИХ частотной области. Задайте длину числителя временной области, заданную параметром NumeratorLength свойство, к числу элементов в импульсной характеристике временной области.

impL    = 400;
Fs      = 8000;
Fcutoff = 2000;
imp     = fir1(impL,2 * Fcutoff / Fs);
H   = fft(imp , 2 * numel(imp));
oa  = dsp.FrequencyDomainFIRFilter('NumeratorDomain','Frequency',...
    'FrequencyResponse', H,...
    'NumeratorLength',numel(imp),...
    'Method','overlap-add');
fprintf('Frequency domain filter latency is %d samples\n',oa.Latency);
Frequency domain filter latency is 402 samples

Создать dsp.FIRFilter Системный объект? и укажите числитель в качестве коэффициентов временной области, вычисленных с помощью fir1 функция, imp. Задержка выхода КИХ на задержку фильтра КИХ частотной области.

fir = dsp.FIRFilter('Numerator',imp);
dly = dsp.Delay('Length',oa.Latency);

Создать два dsp.SineWave объекты. Генерируемые синусоидальные волны имеют частоту дискретизации 8000 Гц, размер кадра 256 и частоты 100 Гц и 3 кГц соответственно. Создать timescope для просмотра отфильтрованных выходных данных.

frameLen  = 256;

sin_100Hz = dsp.SineWave('Frequency',100,'SampleRate',Fs,...
    'SamplesPerFrame',frameLen);
sin_3KHz  = dsp.SineWave('Frequency',3e3,'SampleRate',Fs,...
    'SamplesPerFrame',frameLen);

ts = timescope('TimeSpanOverrunAction','Scroll',...
    'ShowGrid',true,'YLimits',[-1.1 1.1],...
    'TimeSpanSource','Property','TimeSpan',5 * frameLen/Fs,...
    'ShowLegend',true,...
    'SampleRate',Fs,...
    'ChannelNames',{'Overlap-add','Direct-form FIR'});

Вытекание

Поток 1e4 кадров шумных входных данных. Передайте эти данные через фильтр КИХ частотной области и фильтр КИХ временной области. Просмотрите отфильтрованные выходные данные в области времени.

numFrames = 1e4;
for idx = 1:numFrames
    x = sin_100Hz() + sin_3KHz() + 0.01 * randn(frameLen,1);
    y1 = oa(x);
    y2 = fir(dly(x));
    ts([y1,y2]);
end

Выходы обоих фильтров точно совпадают.

Алгоритмы

развернуть все

Наложение - сохранение и наложение - это два метода фильтрации на основе FFT частотной области, используемые этим алгоритмом.

Ссылки

[1] Штокам, Т. Г., младший «Высокоскоростное свертывание и корреляция». Материалы Весенней совместной компьютерной конференции 1966 года, AFIPS, том 28, 1966 год, стр. 229-233.

Расширенные возможности

.
Представлен в R2017b