主要内容

fftfilt

基于fft的重叠相加法FIR滤波

描述

例子

y= fftfilt (bx在向量中过滤数据x用系数向量描述滤波器b

y= fftfilt (bxn使用n来确定FFT的长度。

y= fftfilt (dx在向量中过滤数据x与一个digitalFilter对象d

y= fftfilt (dxn使用n来确定FFT的长度。

例子

y= fftfilt (gpuArraybgpuArrayXn中的数据进行筛选gpuArray(并行计算工具箱)对象gpuArrayX的FIR滤波器系数gpuArray存储在gpuArrayb

例子

全部折叠

验证过滤器操作数越小,效率越高fftfilt对于大操作数更有效。过滤器 10 6 带有两个随机过滤器的随机数:一个是短的,有20次点击,另一个是长的,有2000次点击。使用抽搐而且toc测量执行时间。重复实验100次以提高统计结果。

rng默认的N = 100;SHRT = 20;长= 2000;TFS = 0;TLS = 0;TFL = 0;TLL = 0;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+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;结束

比较并显示平均时间。

流('%4d-tap filter平均值:fftfilt: %f s;滤镜:%f s\n'shrt tfs, tls)
20-tap滤波器平均值:fftfilt: 0.152478 s;滤波器:0.019789秒
流('%4d-tap filter平均值:fftfilt: %f s;滤镜:%f s\n'长,伦敦交通局,tll)
2000-tap滤波器平均值:fftfilt: 0.063124 s;滤波器:0.160203 s

此示例需要并行计算工具箱™软件。指GPU支金宝app持版本(并行计算工具箱)查看支持的gpu列表。金宝app

在白色高斯加性噪声中创建一个由正弦波和组成的信号。正弦波频率为2.5 kHz、5 kHz、10 kHz和15 kHz。采样频率为50khz。

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

设计了一种低通FIR等纹波滤波器designfilt

D = designfilt(“lowpassfir”“SampleRate”Fs,...“PassbandFrequency”, 5500,“StopbandFrequency”, 6000,...“PassbandRipple”, 0.5,“StopbandAttenuation”, 50);B = d.系数;

使用overlap-add方法对GPU数据进行过滤。将数据放在GPU上使用gpuArray.返回输出到MATLAB®工作区使用收集并绘制滤波后数据的功率谱密度估计值。

y = fftfilt(gpuArray(B),gpuArray(x));周期图(收集(y), rectwin(长度(y)),长度(y), 50 e3)

输入参数

全部折叠

过滤器系数,指定为一个向量。如果b是一个矩阵,fftfilt的每一列应用过滤器b对信号向量x

输入数据,指定为向量。如果x是一个矩阵,fftfilt过滤它的列。如果b而且x两个矩阵的列数相同吗的第Th列b用于过滤的第Th列xfftfilt适用于实输入和复杂输入。

FFT长度,指定为正整数。默认情况下,fftfilt选择FFT长度和数据块长度,保证有效的执行时间。

数字滤波器,指定为digitalFilter对象。使用designfilt生成d基于频率响应规范。

GPU阵列,指定为gpuArray对象。gpuArrayb包含过滤器系数和gpuArrayX是输入数据。看到在图形处理器上运行MATLAB函数(并行计算工具箱)有关详情gpuArray对象。使用fftfiltgpuArray对象需要并行计算工具箱™软件。指GPU支金宝app持版本(并行计算工具箱)查看支持的gpu列表。金宝app过滤后的数据,y,是一个gpuArray对象。看到GPU叠加过滤这是一个GPU上重叠添加过滤的例子。

输出参数

全部折叠

输出数据,以矢量、矩阵或形式返回gpuArray对象。

更多关于

全部折叠

相比过滤器函数

当输入信号比较大时,fftfilt过滤器

过滤器执行N每个样本的乘法x,在那里N是过滤器长度。fftfilt执行2个FFT操作-信号块长度的FFTl加上fft的乘积的逆FT,代价是 1 2 l 日志 2 l 在哪里l是块长度。然后执行l逐点乘法的总代价 l + l 日志 2 l l 1 + 日志 2 l 乘法。因此成本比率是 l 1 + 日志 2 l / N l 1 + 日志 2 l / N 近似于log2l/N

因此,fftfilt在log时更快2l小于N

算法

fftfilt使用高效的基于fft的方法对数据进行过滤交叠相加[1],一种频域滤波技术,通过组合输入序列的连续频域滤波块,仅适用于FIR滤波器。执行的操作fftfilt在时域由差分方程描述:

y n b 1 x n + b 2 x n 1 + + b n b + 1 x n n b

等效的表示是z变换或频域描述:

Y z b 1 + b 2 z 1 + + b n b + 1 z n b X z

fftfilt使用fft实现重叠添加方法。fftfilt中断输入序列x到长度l数据块,其中l必须大于过滤器长度N

然后对每个块进行滤波卷积b通过

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

在哪里nfft为FFT长度。fftfilt重叠连续的输出节n - 1点,n是过滤器的长度,并将它们相加。

fftfilt选择关键参数l而且nfft以不同的方式,这取决于你是否提供FFT长度n用于滤波器和信号。如果没有指定值n(决定FFT长度),fftfilt自动选择以下关键参数:

  • 如果长度(x)大于长度(b)fftfilt选择最小化每个FFT的块数乘以flops数的值。

  • 如果长度(b)大于或等于长度(x)fftfilt使用一个长度的FFT

    2^nextpow2(长度(b) +长度(x) - 1)

    这个计算

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

如果你提供一个值nfftfilt选择FFT长度,nfft的,2 ^ nextpow2 (n)和一个数据块的长度nfft-长度(b)+1.如果n小于长度(b)fftfiltn长度(b)

参考文献

奥本海姆、艾伦五世、罗纳德·w·谢弗和约翰·r·巴克。离散时间信号处理.第二版。上马鞍河,新泽西州:普伦蒂斯大厅,1999年。

扩展功能

版本历史

R2006a之前介绍