线性卷积的FFT算法及其matlab实现

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

线性卷积的FFT算法

线性卷积是求离散系统响应的主要方法之一,许多重要应用都建立在这一理论基础上,如卷积滤波等。

以前曾讨论了用循环卷积计算线性卷积的方法归纳如下:

将长为N

2的序列x(n)延长到L,补L-N

2

个零

将长为N

1的序列h(n)延长到L,补L-N

1

个零

如果L≥N1+N2-1,则循环卷积与线性卷积相等,此时,可有FFT计算线性卷积,方法如下:

a.计算X(k)=FFT[x(n)]

b.求H(k)=FFT[h(n)]

c.求Y(k)=H(k)Y(k) k=0~L-1

d.求y(n)=IFFT[Y(k)] n=0~L-1

可见,只要进行二次FFT,一次IFFT就可完成线性卷积计算。计算表明,L>32时,上述计算线性卷积的方法比直接计算线卷积有明显的优越性,因此,也称上述循环卷积方法为快速卷积法。

上述结论适用于x(n),h(n)两序列长度比较接近或相等的情况,如果

x(n),h(n)长度相差较多,例如,h(n)为某滤波器的单位脉冲响应,长度有限,用来处理一个很长的输入信号x(n),或者处理一个连续不断的信号,按上述方法,h(n)要补许多零再进行计算,计算量有很大的浪费,或者根本不能实现。为了保持快速卷积法的优越性,可将x(n)分为许多段后处理,每小段的长与h(n)接近,其处理方法有两种:

(1)重叠相加法——由分段卷积的各段相加构成总的卷积输出

假定x

i

(n)表示图中第i段x(n)序列:

则输入序列可表为:

于是输出可分解为:

其中

由此表明,只要将x(n)的每一段分别与h(n)卷积,然后再将这些卷积结果

相加起来就可得到输出序列,这样,每一段的卷积都可用上面讨论的快速卷积来

计算。先对h(n)及x

i

(n)补零,补到具有N点长度,N=N1+N2-1。一般选择N=2M,然后用基2 FFT算法通过正反变换计算

y i (n)=x

i

(n)*h(n)

由于y

i (n)的长度为N,而x

i

(n)的长度为N

2

,因此相邻两y

i

(n)序列必然

有N-N

2=N

1

-1点发生重叠,这个重叠部分应该相加起来才能构成最后的输出序列。

计算步骤:

a. 事先准备好滤波器参数H (k )=DFT[h (n )],N 点

b.用N 点FFT 计算X i (k )=DFT[x i (n)]

c.Y i (k)=X i (k)H(k)

d.用N 点IFFT 求 y i (n )=IDFT[Y i (k)]

e.将重叠部分相加

(2)重叠保存法

这种方法和第一种方法稍有不同,即将上面分图序列中补零的部分不是补零,而是保留原来的输入序列值,且保留在各段的前端,这时,如利用DFT 实现h (n )和x i (n )的循环卷积,则每段卷积结果的前N 1-1个点不等于线性卷积值需舍去。 为了清楚地看出这点,研究一下x (n )中一段长为N 的序列x i (n )与h (n )(长为N1)的循环卷积情况:

由于h (n )的长度为N 1,当0≤n ≤N 1-2时,h((n-m))N 将在x i (m )的尾部出现有非零值,如图n=1的情况就是如此,所以0≤n ≤N 1-2这部分y i (n)值中将混入x i (m)尾部与h((n-m))N 的卷积值,从而使y i (n)不同于线性卷积结果,但当n=N 1-1~N-1时,则有h((n-m))N =h (n-m ),因此从n=N 1-1点开始圆周圈卷积值完全与线性卷积值一样,y i (n )的后面N 2点才是正

确的卷积值,而每一段卷积运算结果的前N 1-1点个值需去掉。

为了不造成输出信号遗漏,对x (n )分段时,需使相邻两段有N 1-1个点的重叠(对于第一段,x(n)由于没有前一段保留信号,在其前填补N 1-1点个零点)。

为此将x i (n )定义为

每段和h (n )的循环卷积以y i (n )表示,

,由FFT 算出,去

掉y i (n )的前N 1-1点,再把相邻各段输出顺次连接起来就构成了最终的输出序

列y (n )。 重叠保留法每一输入段均由N-N 1+1= N 2个新点和前一段保留下来的N 1-1个点所组成(N=N 1+N 2-1)。值得注意的是,对于有限长时间序列x(n)(长度为L=M

× N

2

),在结束段(i=M-1)做完后,我们所得到的只是L点的线性卷积,还少

了N

1

-1点,实际上就是h(-n)移出x(n)尾部时的不完全重合点,或者说是最后

一段的重叠部分(N

1

-1个点,即每次都要删除的长度,但由于其位于序列尾部,

故在其后增加N

2

个0以再行计算最后一次)少做了一次卷积,为此,应再补做

这一段N

1-1点,在其后填补N

2

点个零点保证长度仍为N点,一样舍去前取N

1

-1

点,并从N

1-1点开始,保留N

2

-1点。

重叠保留法与重叠相加法的计算量差不多,但省去了重叠相加法最后的相加运算。一般来说,用FFT作信号滤波,只用于FIR滤波器阶数h(n)大于32的

情况下,且取N

2=(5~10)N

1

,这样可接近于最高效的运算。

Matlab实现:

function [y] = ovrlpsav(x,h,N)

% Overlap-Save method of block convolution

% ----------------------------------------

% [y] = ovrlpsav(x,h,N)

%y=output sequence

%x=input sequence

%h=impulse response

%N=block length

%

Lenx = length(x);

M = length(h);

M1 = M-1;

L = N-M1; %没有发生混叠的部分(实际的线性卷积结果)长h=[h zeros(1,N-M)];

%

x=[zeros(1,M1), x, zeros(1,L)]; % preappend (M-1) zeros

K=floor((Lenx+M-1)/(L)); % # of blocks

Y=zeros(K+1,N);

% convolution with succesive blocks

for k=0:K

xk = x(k*L+1:k*L+N);

Y(k+1,:) = circconv(xk,h,N); %circular convolution

end

Y=Y(:,M:N)'; % discard the first (M-1) samples

y=(Y(:))'; % assemble output

相关文档
最新文档