主要内容

fftfilt

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

描述

例子

y= fftfilt (bx以vector形式过滤数据x滤波器用系数向量来描述b

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

y= fftfilt (dx以vector形式过滤数据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,1,6);bsht = rand(1, sht);Tic SFS = fftfilt(bshrt,x);tfs = tfs+toc/N;Tic SLS = filter(bshrt,1,x);tls = tls+toc/N;long = rand(1,long);Tic SFL = fftfilt(blong,x);tfl = tfl+toc/N;Tic SLL = filter(blong,1,x); tll = tll+toc/N;结束

比较并显示平均时间。

流('%4d抽头滤波器平均值:fftfilt: %f s;过滤器:%f s\n'shrt tfs, tls)
20分路滤波器平均值:fftfilt: 0.074759 s;过滤器:0.005739秒
流('%4d抽头滤波器平均值:fftfilt: %f s;过滤器:%f s\n'长,伦敦交通局,tll)
2000个抽头滤波器平均值:fftfilt: 0.029470 s;过滤器:0.150602秒

这个例子需要Parallel Computing Toolbox™软件。指GPU计算要求(并行计算工具箱)查看支持的gpu列表。

在白色高斯加性噪声中创建一个由正弦波和组成的信号。正弦波频率为2.5、5、10和15khz。采样频率为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。系数;

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

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

输入参数

全部折叠

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

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

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

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

GPU阵列,指定为agpuArray对象。gpuArrayb包含过滤器系数,和gpuArrayX是输入数据。看到在GPU上运行MATLAB函数(并行计算工具箱)欲知详情gpuArray对象。使用fftfiltgpuArray对象需要Parallel Computing Toolbox™软件。指GPU计算要求(并行计算工具箱)查看支持的gpu列表。过滤后的数据,y,是一个gpuArray对象。看到在GPU上添加重叠过滤在GPU上进行重叠添加过滤的示例。

输出参数

全部折叠

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

更多关于

全部折叠

相比过滤器函数

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

过滤器执行N中每个样本的乘法x,在那里N是过滤器的长度。fftfilt执行2个FFT操作- FFT的长度的信号块l加上傅里叶变换乘积的逆傅里叶变换代价是 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 也就是近似对数2l/N

因此,fftfiltlog的速度更快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选择关键参数lnfft以不同的方式,这取决于您是否提供FFT长度n用于滤波器和信号。的值n(决定FFT长度),fftfilt自动选择这些关键参数:

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

  • 如果长度(b)是大于还是等于长度(x)fftfilt使用长度为的单个FFT

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

    这个计算

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

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

参考文献

[1]奥本海姆,艾伦V,罗纳德W.谢弗和约翰R.巴克。离散时间信号处理.第2版。上马鞍河,NJ: Prentice Hall, 1999。

扩展功能

版本历史

R2006a之前引入

Baidu
map