fftfilt

Фильтрация конечной импульсной характеристики на основе БПФ с использованием метода перекрытия-суммы

Описание

пример

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 (Parallel Computing Toolbox) gpuArrayX с коэффициентами конечной импульсной характеристики в 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™. Список поддерживаемых графических процессоров см. в разделе Поддержка графического процессора по версии (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));

Проектируйте lowpass конечную импульсную характеристику фильтр равновесия с помощью 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 на основе спецификаций частотной характеристики.

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

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

свернуть все

Выходные данные, возвращенные в виде вектора, матрицы или 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 что составляет приблизительно log2  L/ N.

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

Алгоритмы

fftfilt фильтрует данные с помощью эффективного FFT-основанного метода наложения-сложения [1], частотного диапазона метода фильтрации, который работает только для конечной импульсной характеристики фильтров путем объединения последовательных частотных диапазонов отфильтрованных блоков входа последовательности. Операция, выполненная fftfilt описывается во временном интервале разностным уравнением:

y(n)=b(1)x(n)+b(2)x(n1)++b(nb+1)x(nnb)

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

Y(z)=(b(1)+b(2)z1++b(nb+1)znb)X(z)

fftfilt использование fft для реализации метода перекрытия-суммы. fftfilt нарушает последовательность входа x в блоки length L data, где 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] Oppenheim, Alan V., Ronald W. Schafer, and John R. Buck. Обработка сигнала в дискретном времени. 2nd Ed. Upper Saddle River, NJ: Prentice Hall, 1999.

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

..

См. также

| | | |

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