zoukankan      html  css  js  c++  java
  • 用离散傅里叶变换实现线性卷积

    两个长度为N的序列的线性卷积的长度为2N-1;

    两个长度为N的序列的周期卷积的周期为N。

    如果我们将两个长度为N的序列做DFT、相乘、IDFT,得到的是这两个序列的周期卷积。

    周期卷积的结果可看做线性卷积移位rN个点后的线性叠加(r为整数,-∞<r<∞)。因为移位长度N小于线性卷积长度2N-1,所以发生了时域混叠。

    因此,如果将这两个序列补零到长度为2N-1,那么就不会发生时域混叠,周期卷积的一个周期就等于这两个序列的线性卷积。

    根据以上内容,可以设计出两种用离散傅立叶变换实现线性卷积的方法:

    1. 重叠相加法

    我们知道,卷积是线性运算,因此可以将输入x[n]拆分为许多长度为L的子序列,与长度为P的h[n](用离散傅里叶变换)做(周期)卷积,然后将卷积结果移位叠加。当然,DFT的长度至少为L+P-1,x[n]和h[n]都补零到这个长度,以使得周期卷积的一个周期等于线性卷积。各次卷积结果相互间隔L重叠相加得到结果。

    x[n]的第一个子序列与h[n]卷积结果所在区间为[0, L+P-2];    // 长度L+P-1

    x[n]的第二个子序列与h[n]卷积结果所在区间为[L, 2L+P-2];  // 与第一个序列的重叠部分为[L, L+P-2],重叠部分长度P-1

    ……

    2. 重叠保留法

    同样将输入序列拆分为长度为L的子序列。和重叠相加法不同,这种方法保留下循环卷积结果中和线性卷积相同的部分,丢弃不同的部分,然后将输出序列补在一起。因此,在拆分x[n]的时候是“重叠”拆分的。取L>P,DFT长度为L,线性卷积长度应为L+P-1,但周期卷积长度只有L,这可以看做将线性卷积尾巴上的P-1个点“回绕”到头部做叠加,因此(用离散傅里叶变换)做卷积后的开头P-1个点是不正确的,将其丢弃。剩下的L-P+1个点是正确的。这种方法必须取L>P,否则周期卷积的所有点都不等于线性卷积。

    x[n]的第一个子序列为x[0, L-1];

    x[n]的第二个子序列为x[L-(P-1), 2L-P];

    ……

    更详细理论参考奥本海默,《离散时间信号处理》。

    ---------------------------------------------------------------------------------------------------------------

    Example 1

    设h[n]长度P为500。

    使用重叠相加法,DFT长度取为1024,于是输入数据长度L必须满足L+P-1<=1024,L<=525。取L=512。

    将L和P都补零到1024,每次卷积结果长度就是DFT长度1024,每次重叠相加部分长度512。

    Example 2

    设h[n]长度P为500。

    使用重叠保留法,输入数据长度L和DFT长度相同,必须大于P,取为1024。h[n]补零到1024。

    每次DFT长度1024,丢弃点数需大于P-1即499。为了方便,卷积后丢弃前面512点,保留后512点。

    每次取输入数据时,将上一次运算时的512点和新的512点拼成1024点。

  • 相关阅读:
    我的知识库(4) java获取页面编码(Z)
    知识库(3)JAVA 正则表达式 (超详细)
    The Struts dispatcher cannot be found. This is usually caused by using Struts tags without the associated filter. Struts
    某人总结的《英语听力的技巧 》,挺搞的
    我的知识库(5)java单例模式详解
    构建可扩展程序
    SerialPort (RS232 Serial COM Port) in C# .NET
    Python学习笔记——String、Sequences
    UI题目我的答案
    jQuery学习系列学会操纵Form表单元素(1)
  • 原文地址:https://www.cnblogs.com/byeyear/p/6111206.html
Copyright © 2011-2022 走看看