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 касаниями, и длинный, с 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.180189 s; filter: 0.005549 s
fprintf('%4d-tap filter averages: fftfilt: %f s; filter: %f s\n',long,tfl,tll)
2000-tap filter averages: fftfilt: 0.041373 s; filter: 0.093555 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)

Входные параметры

свернуть все

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

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

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

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

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

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

свернуть все

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

Больше о

свернуть все

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

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

filter выполняет умножение N для каждой выборки в x, где N является длиной фильтра. fftfilt выполняет 2 операции FFT — БПФ блока сигнала длины L плюс обратный FT продукта БПФ — за счет 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(n1)++b(nb+1)x(nnb)

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

Y(z)=(b(1)+b(2)z1++b(nb+1)znb)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 выбирает длину FFT, nfft, из 2^nextpow2(n) и длина блока данных nfft - length(b)+ 1 . Если n меньше length(b), fftfilt наборы n к length(b).

Ссылки

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

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

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

| | | |

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