exponenta event banner

fftfilt

Фильтрация FIR на основе FFT с использованием метода наложения-добавления

Описание

пример

y = fftfilt(b,x) фильтрация данных в векторе x с фильтром, описанным вектором коэффициентов b.

y = fftfilt(b,x,n) использование n для определения длины БПФ.

y = fftfilt(d,x) фильтрация данных в векторе x с digitalFilter объект d.

y = fftfilt(d,x,n) использование n для определения длины БПФ.

пример

y = fftfilt(gpuArrayb,gpuArrayX,n) фильтрует данные в gpuArray(Панель инструментов параллельных вычислений) gpuArrayX с коэффициентами фильтра FIR в gpuArray хранится в gpuArrayb.

Примеры

свернуть все

Убедитесь, что filter является более эффективным для небольших операндов и fftfilt является более эффективным для больших операндов. Фильтр 106 случайных чисел с двумя случайными фильтрами: короткий, с 20 отводами, и длинный, с 2000. Использовать tic и toc для измерения времени выполнения. Повторите эксперимент 100 раз для улучшения статистики.

rng default

N = 100;

shrt = 20;
long = 2000;

tfs = 0;
tls = 0;
tfl = 0;
tll = 0;

for kj = 1:N
    
    x = rand(1,1e6);

    bshrt = rand(1,shrt);

    tic
    sfs = fftfilt(bshrt,x);
    tfs = tfs+toc/N;

    tic
    sls = filter(bshrt,1,x);
    tls = tls+toc/N;

    blong = rand(1,long);

    tic
    sfl = fftfilt(blong,x);
    tfl = tfl+toc/N;
    
    tic
    sll = filter(blong,1,x);
    tll = tll+toc/N;

end

Сравните и просмотрите среднее время.

fprintf('%4d-tap filter averages: fftfilt: %f s; filter: %f s\n',shrt,tfs,tls)
  20-tap filter averages: fftfilt: 0.133909 s; filter: 0.003542 s
fprintf('%4d-tap filter averages: fftfilt: %f s; filter: %f s\n',long,tfl,tll)
2000-tap filter averages: fftfilt: 0.052996 s; filter: 0.036697 s

В этом примере требуется программное обеспечение Parallel Computing Toolbox™. Список поддерживаемых графических процессоров см. в документе Поддержка графического процессора по выпуску (Панель инструментов параллельных вычислений).

Создайте сигнал, состоящий из суммы синусоидальных волн в белом гауссовом аддитивном шуме. Синусоидальные частоты составляют 2,5, 5, 10 и 15 кГц. Частота дискретизации составляет 50 кГц.

Fs = 50e3;
t = 0:1/Fs:10-(1/Fs);
x = cos(2*pi*2500*t) + 0.5*sin(2*pi*5000*t) + 0.25*cos(2*pi*10000*t)+ ...
    0.125*sin(2*pi*15000*t) + randn(size(t));

Спроектируйте низкочастотный equiripple-фильтр FIR с использованием designfilt.

d = designfilt('lowpassfir','SampleRate',Fs, ...
    'PassbandFrequency',5500,'StopbandFrequency',6000, ...
    'PassbandRipple',0.5,'StopbandAttenuation',50);
B = d.Coefficients;

Фильтрация данных в графическом процессоре с помощью метода наложения-добавления. Поместить данные в графический процессор с помощью gpuArray. Возврат выходных данных в рабочую область MATLAB ® с помощьюgather и строят график оценки спектральной плотности мощности отфильтрованных данных.

y = fftfilt(gpuArray(B),gpuArray(x));
periodogram(gather(y),rectwin(length(y)),length(y),50e3)

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

свернуть все

Коэффициенты фильтра, заданные как вектор. Если b является матрицей, fftfilt применяет фильтр в каждом столбце b к вектору сигнала x.

Входные данные, указанные как вектор. Если x является матрицей, fftfilt фильтрует свои столбцы. Если b и x обе матрицы с одинаковым количеством столбцов, i-й столбец b используется для фильтрации i-го столбца x. fftfilt работает как для действительных, так и для сложных входов.

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

Цифровой фильтр, указанный как digitalFilter объект. Использовать designfilt произвести d на основе характеристик частотно-отклика.

Массивы GPU, указанные как gpuArray объект. gpuArrayb содержит коэффициенты фильтра, и gpuArrayX - входные данные. См. раздел Выполнение функций MATLAB на графическом процессоре (панель инструментов параллельных вычислений) для получения подробной информации о gpuArray объекты. Используя fftfilt с gpuArray Для объектов требуется программное обеспечение Parallel Computing Toolbox™. Список поддерживаемых графических процессоров см. в документе Поддержка графического процессора по выпуску (Панель инструментов параллельных вычислений). Отфильтрованные данные, y, является gpuArray объект. Пример фильтрации наложения-добавления на GPU см. в разделе Фильтрация наложения-добавления на GPU.

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

свернуть все

Выходные данные, возвращаемые в виде вектора, матрицы или gpuArray объект.

Подробнее

свернуть все

Сравнение с filter функция

Когда входной сигнал относительно велик, fftfilt быстрее, чем filter.

filter выполняет N умножений для каждой выборки в x, где N - длина фильтра. fftfilt выполняет 2 операции БПФ - БПФ сигнального блока длиной L плюс обратный БП произведения БПФ - ценой 12Llog2L, где L - длина блока. Затем он выполняет L точечных умножений для общей стоимости L + Llog2L = L (1 + log2L) умножений. Таким образом, коэффициент затрат равен L (1 + log2L )/( NL) = (1 + log2L )/N, что приблизительно равно   log2L/N.

Поэтому fftfilt быстрее, когда log2L меньше N.

Алгоритмы

fftfilt фильтрует данные, используя эффективный основанный на БПФ способ наложения-сложения [1], способ фильтрации в частотной области, который работает только для КИХ-фильтров путем объединения последовательных фильтруемых в частотной области блоков входной последовательности. Операция, выполняемая fftfilt описывается во временной области уравнением разности:

y (n) = b (1) x (n) + b (2) x (n 1) +⋯+b (nb + 1) x (n − nb)

Эквивалентным представлением является Z-преобразование или описание частотной области:

Y (z) = (b (1) + b (2) z−1+⋯+b (nb + 1) z − nb) X (z)

fftfilt использование fft для реализации метода наложения-добавления. fftfilt разрывает последовательность ввода x в блоки данных длины L, где L должен быть больше длины фильтра N.

и сворачивает каждый блок с фильтром b около

y = ifft(fft(x(i:i+L-1),nfft).*fft(b,nfft));

где nfft - длина БПФ. fftfilt перекрывает последовательные выходные секции n-1 точки, где n - длина фильтра и суммирует их.

fftfilt выбирает ключевые параметры L и nfft различными способами, в зависимости от того, укажите ли вы длину БПФ n для фильтра и сигнала. Если не указано значение для n (которая определяет длину БПФ), fftfilt автоматически выбирает следующие ключевые параметры:

  • Если length(x) больше, чем length(b), fftfilt выбирает значения, которые минимизируют количество блоков, умноженное на число триггеров на БПФ.

  • Если length(b) больше или равно length(x), fftfilt использует один БПФ длины

    2^nextpow2(length(b) + length(x) - 1)
    

    Это вычисляет

    y = ifft(fft(B,nfft).*fft(X,nfft))
    

При вводе значения для n, fftfilt выбирает длину БПФ, nfftиз 2^nextpow2(n) и длина блока данных nfft - length(b) + 1. Если n меньше, чем length(b), fftfilt наборы n кому length(b).

Ссылки

[1] Оппенгейм, Алан В., Рональд В. Шефер и Джон Р. Бак. Дискретно-временная обработка сигналов. 2-я эд. река Верхнее Седло, Нью-Джерси: Прентис Холл, 1999.

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

..

См. также

| | | |

Представлен до R2006a