0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

FIR连续采样分段卷积时域重叠相加法

安费诺传感器学堂 来源:安费诺传感器学堂 2024-06-14 10:30 次阅读

在上一个文档里,我们提到了FIR系统在时域的分段卷积中使用“重叠保留(Overlap-Save)”的处理方式,这里我们续集,说明一下“重叠相加(Overlap-Add)”的处理方式。 信号处理在时域和频域中处理是有差异的。 说得通俗一点就是:时域中处理是直接用采集到的信号进行计算;而频域中则要用离散傅里叶变换(DFT)/离散傅里叶反变换(IDFT)对采集到的信号进行转换到频域,然后再从频域转回时域处理。

在我们看到的参考文档[1]中,描述的是在频域进行DFT,然后由IDFT转回时域处理的过程。如下图所示。大概的过程是:

每次处理的数据长度为L,然后在每分段的尾部添加(M-1)个0之后,让每次处理的数据序列长度N=L+M-1,通常N为2的幂次倍;

同时对于滤波器,也需要将原来长度为b的序列,通过填0的方式增加到长度为N;

由DFT将两个数列分别转换到频域,相乘后,再IDFT转回时域,就得到N=(L+M-1)的时域卷积结果;

保留每次操作的所有数据,然后在下一次操作结束后,将最新数据的最前面的(M-1)个结果数据和上一次结果数据的最后(M-1)个数据顺序相加......持续直至结束。

3b52778c-2986-11ef-a4c8-92fbcf53809c.png

FIR频域的重叠相加示意图

我们看看时域的卷积应该怎么操作。

3b759190-2986-11ef-a4c8-92fbcf53809c.png

FIR时域重叠相加操作示意图

如上图所示:

每次读取长为L的数据序列,然后与长度为M的滤波器进行卷积,生成一个(L+M-1)的卷积结果序列;

保留每次操作的所有数据,然后在下一次操作结束后,将最新数据的最前面的(M-1)个结果数据和上一次结果数据的最后(M-1)个数据顺序相加......持续直至结束。

两个过程看起来略有差异,甚至会觉得时域的处理更简单省事,会不会更省时?其实频域看起来费时,但数据规模到了一定程度之后,频域的处理速度就具有优势了。然而对于一般的应用,直接卷积操作还是可以接受的。

还记得上次我们提到Python中卷积函数np.convolve的三种模式吧?该函数对卷积是在时域中进行的。

在Python中,卷积函数np.convolve(data_segment, b, mode)对指定长度的数据data_segment(长度L),和FIR滤波器系数序列b(长度M)进行卷积。输出的结果序列则分为以下三种:

full:结果长度=M+L-1

same:结果长度=max(M,L)

valid:结果长度=max(M,L)-min(M,L)+1=L-(M-1)

在这里,我们需要选用full模式,这样就获取每段卷积一个不落的所有数据(L+M-1)。先看模拟效果后看Python代码。 故事情节设定:50Hz的信号中,夹杂300,450Hz的干扰。滤除干扰。

3b92b48c-2986-11ef-a4c8-92fbcf53809c.png

FIR选频滤波器的幅频响应

3ba70892-2986-11ef-a4c8-92fbcf53809c.png

FIR系统重叠相加的滤波结果示意图

这里要特别说明一点:卷积后的数据长度,最终会比原来的数多出(M-1)个,所以输出到图的时候,需要有意控制长度。 滤波过程中要经历“热身”,所以最开始阶段有(M-1)个数据也是可以剔除的。同样,如果我们看卷积最终结果尾部不处理,也有(M-1)个无效数据的输出需要截取。

3bd9424e-2986-11ef-a4c8-92fbcf53809c.png

卷积后尾部无效数据(M-1)

上代码,我们自己在代码中划重点,并调整输出结果的有效长度范围:

import numpy as np
import matplotlib.pyplot as plt
from scipy import signal
from scipy.fft import fft
import math


# 创建带通滤波器
f1 = 40
f2 = 60
filter_len = 80     # 滤波器长度
fs = 1600           # 采样频率维持不变


b = signal.firwin(filter_len, [f1, f2], pass_zero=False, fs=fs)


# 设置数据长度
seg_filter_len = 256                            # filter output length of each segment data
segment_len = seg_filter_len - filter_len + 1   # 分段数据目标长度 seg_filter_len = segment_len + filter_len - 1
target_length = segment_len * 50                # 总数据长度


# 而新的时间序列的上限 b
bspace = target_length / fs


# 生成的时间序列为L的整数倍,模拟每次采样的数据的长度
t = np.arange(0, bspace, 1/fs)


# 产生一个含有300Hz,450Hz和50Hz信号的模拟信号
x = np.sin(2 * np.pi * 50 * t) + 0.5 * np.sin(2 * np.pi * 300 * t) + 0.5 * np.sin(2 * np.pi * 450 * t)


segments = []
for i in range(0, len(x), segment_len):
    segments.append(x[i:i+segment_len])


#Filtering&Overlap-Add processing
# Total outputput buffer, len = target_length + filter_len - 1
filtered_signals = np.zeros(target_length + filter_len - 1)             
for i in range(len(segments)):
    filtered_segment = np.convolve(segments[i], b, mode='full')    # full模式用于保留所有卷积结果 N = L + M -1
    filtered_signals[i*segment_len:i*segment_len+len(filtered_segment)] += filtered_segment # 叠加过程


filtered_signals = filtered_signals#[:target_length] # 保留和原信号等长的部分


#FilterFreqResponse
w, h = signal.freqz(b, 1, fs=fs)
plt.figure()
plt.plot(w, abs(h))
plt.title('Filter Freq Response')
plt.grid()
plt.xlabel('f[Hz]')
plt.ylabel('Amplitude')


# Signal Before filtering & Spectrum
n = len(x)
freq = np.fft.fftfreq(n, 1/fs)
y = np.fft.fft(x)


plt.figure()
plt.subplot(221)
plt.plot(t[:500], x[:500])
plt.title('Original Signal')
plt.subplot(222)
plt.plot(freq[:n//2], np.abs(y[:n//2]*2/n)) # 标幺,绘制前一半
plt.title('SpectrumofOrginalSignal')
plt.grid()


#SignalAfterfiltering & Spectrum
n = len(x)
y = np.fft.fft(filtered_signals)


plt.subplot(223)
# 1. Normal output
plt.plot(t[:500], filtered_signals[:500])
plt.title('Filtered Signal')
plt.subplot(224)
plt.plot(freq[:n//2], np.abs(y[:n//2]*2/n)) # 标幺,绘制前一半
plt.title('Spectrum of Filtered Signal')
plt.grid()


plt.tight_layout()


plt.show()


# 2. End of convolution without end cutoff: for test purpose
plt.figure()
temp = t[8000:8850]
s = filtered_signals[8079:8929]
plt.plot(temp, s)
plt.title('Filtered Signal')
plt.grid()
plt.show()

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 数字滤波器
    +关注

    关注

    4

    文章

    256

    浏览量

    46821
  • FIR
    FIR
    +关注

    关注

    4

    文章

    138

    浏览量

    32824
  • 信号
    +关注

    关注

    11

    文章

    2683

    浏览量

    75760

原文标题:数字滤波器(5)—FIR连续采样分段卷积时域重叠相加法

文章出处:【微信号:安费诺传感器学堂,微信公众号:安费诺传感器学堂】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    运算放大器的同相加法器和反相加法

      运算放大器构成加法器 可以分为同相加法器和反相加法
    发表于 08-05 17:17 2.6w次阅读
    运算放大器的同<b class='flag-5'>相加法</b>器和反<b class='flag-5'>相加法</b>器

    求函数计算序列线性卷积结果

    定义一个函数文件,功能是采用重叠相加法完成无限长序列与有限长序列的线性卷积,然后用该函数文件计算序列x[k]=2k+1,0≤k≤18与序列h[k]={1,2,3,4;k=0,1,2,3}的线性
    发表于 11-29 13:36

    毕业设计_分段卷积MATLAB仿真与DSP实现

    相加法重叠保留法。每种方法先对输入序列进行分段,再将各段进行快速傅里叶变换,接着进行傅里叶逆变换得到各段输出,将输出结果进行处理就得到了最终结果
    发表于 12-25 13:43

    采样的频域效应解析

    来看看。  首先要记住的是,时域信号相乘相当于频域卷积。因此,我们可以通过将原始信号的傅立叶变换与增量函数的傅立叶变换进行卷积,从而得到采样信号的傅立叶变换。  事实证明,增量函数的傅
    发表于 09-02 17:42

    相加法电路(由LF155组成的)

    相加法电路(由LF155组成的)
    发表于 01-21 14:16 4931次阅读
    同<b class='flag-5'>相加法</b>电路(由LF155组成的)

    相加法电路

    相加法运算电路为若干个输入信号从集成运放的反相输入端引入,输出信号为它们反相按比例放大的代数和。
    发表于 09-22 11:44 3166次阅读
    反<b class='flag-5'>相加法</b>电路

    相加法器电路原理与同相加法器计算

    相加法器输入阻抗高,输出阻抗低 反相加法器输入阻抗低,输出阻抗高.加法器是一种数位电路,其可进行数字的加法计算。当选用同相加法器时,如A输
    发表于 09-13 17:23 5.6w次阅读
    同<b class='flag-5'>相加法</b>器电路原理与同<b class='flag-5'>相加法</b>器计算

    重叠分段循环相关法在弱GPS信号捕获中的实现_范翔

    重叠分段循环相关法在弱GPS信号捕获中的实现_范翔
    发表于 03-20 09:07 0次下载

    运算电路:同相加法运算电路与反相加法运算电路解析

    加法运算电路能实现多个模拟量的求和运算。图1所示为一个3个输入信号的反相加法运算电路。
    发表于 05-15 09:41 20.2w次阅读
    运算电路:同<b class='flag-5'>相加法</b>运算电路与反<b class='flag-5'>相加法</b>运算电路解析

    加法器与减法器_反相加法器与同相加法

    加法器是产生数的和的装置。加数和被加数为输入,和数与进位为输出的装置为半加器。减法电路是基本集成运放电路的一种,减法电路可以由反相加法电路构成,也可以由差分电路构成。基本集成运放电路有加、减、积分和微分等四种运算。一般是由集成运放外加反馈网络所构成的运算电路来实现。
    发表于 08-16 11:09 16.2w次阅读
    <b class='flag-5'>加法</b>器与减法器_反<b class='flag-5'>相加法</b>器与同<b class='flag-5'>相加法</b>器

    连续时间系统时域分析的MATLAB实现

    掌握应用 MATLAB 实现对线性时不变连续时间系统的时域分析,即熟悉应用 MATLAB 实现微分方程的求解、连续时间信号卷积计算等。
    发表于 11-10 08:00 0次下载
    <b class='flag-5'>连续</b>时间系统<b class='flag-5'>时域</b>分析的MATLAB实现

    LTE-A系统的主同步信号重叠分段检测算法

    LTE-A系统的主同步信号重叠分段检测算法
    发表于 06-24 15:38 5次下载

    实用电路分享-同相加法

    相加法器(又称为同相组合器、输入能量合成器、同相求和器)是一种电子电路器件,主要应用在通信、信号处理、调试和测量等领域。
    的头像 发表于 06-13 14:53 8878次阅读
    实用电路分享-同<b class='flag-5'>相加法</b>器

    什么是反相加法运算电路?反相加法运算电路与减法运算电路

    在电子技术的海洋中,有一种电路如同数学中的加法器一样,能够将不同的信号进行相加处理。这就是被广泛应用于信号处理领域的反相加法运算电路。
    的头像 发表于 02-17 15:34 2694次阅读
    什么是反<b class='flag-5'>相加法</b>运算电路?反<b class='flag-5'>相加法</b>运算电路与减法运算电路

    相加法器和反相加法器的区别是什么

    相加法器和反相加法器是运算放大器在模拟电路设计中常用的两种基本电路结构,它们在信号处理方面有着不同的特性和应用场景。
    的头像 发表于 05-23 14:35 621次阅读