fftfilt

Основанная на БПФ КИХ-фильтрация с помощью перекрытия - добавляет метод

Синтаксис

y = fftfilt(b,x)
y = fftfilt(b,x,n)
y = fftfilt(d,x)
y = fftfilt(d,x,n)
y = fftfilt(gpuArrayb,gpuArrayX,n)

Описание

fftfilt фильтрует данные с помощью эффективного основанного на БПФ метода перекрытия - добавляют, метод фильтрации частотного диапазона, который работает только на КИХ-фильтры.

y = fftfilt(b,x) фильтрует данные в векторном x с фильтром, описанным вектором коэффициентов b. Это возвращает вектор данных y. Операция, выполняемая 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 и длину блока данных, которые гарантируют эффективное время выполнения.

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

y = fftfilt(b,x,n) использование n, чтобы определить длину БПФ. См. Алгоритмы для получения информации.

y = fftfilt(d,x) фильтрует данные в векторном x с объектом digitalFilter, d. Используйте designfilt, чтобы сгенерировать d на основе спецификаций частотной характеристики.

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

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

fftfilt работает и на действительные и на комплексные входные параметры.

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

Когда входной сигнал является относительно большим, выгодно использовать fftfilt вместо filter, который выполняет умножение N для каждой выборки в x, где N является длиной фильтра. fftfilt выполняет 2 операции FFT — БПФ блока сигнала длины L плюс обратный FT продукта БПФ — за счет

½Llog2L

где L является длиной блока. Это затем выполняет L мудрое точкой умножение для общей стоимости

L + L log2L = L (1 + log2L)

умножение. Отношение стоимости поэтому

L (1+log2L)  / (N L) = (1 + log2L)/N

который является приблизительно log2L / N.

Поэтому fftfilt становится выгодным когда log2Lis меньше, чем N.

Примеры

свернуть все

Проверьте, что filter более эффективен для меньших операндов, и fftfilt более эффективен для больших операндов. Фильтр 106 случайные числа с двумя случайными фильтрами: короткий, с 20 касаниями, и длинный, с 2 000. Используйте 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.205004 s; filter: 0.006425 s
fprintf('%4d-tap filter averages: fftfilt: %f s; filter: %f s\n',long,tfl,tll)
2000-tap filter averages: fftfilt: 0.040889 s; filter: 0.087492 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 КИХ equiripple фильтр с помощью 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)

Алгоритмы

fftfilt использует fft, чтобы реализовать перекрытие - добавляет метод [1], метод, который комбинирует последовательный частотный диапазон, отфильтровал блоки входной последовательности. 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 выбирает длину FFT, nfft, 2^nextpow2(n) и длины блока данных nfft - length(b) + 1. Если n является меньше, чем length(b), fftfilt устанавливает n на length(b).

Ссылки

[1] Оппенхейм, Алан V, Рональд В. Шафер и Джон Р. Бак. Обработка сигналов дискретного времени. 2-й Эд. Верхний Сэддл-Ривер, NJ: Prentice Hall, 1999.

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

Смотрите также

| | | |

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