0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線(xiàn)課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

FIR連續(xù)采樣分段卷積時(shí)域重疊相加法

安費(fèi)諾傳感器學(xué)堂 ? 來(lái)源:安費(fèi)諾傳感器學(xué)堂 ? 2024-06-14 10:30 ? 次閱讀

在上一個(gè)文檔里,我們提到了FIR系統(tǒng)在時(shí)域的分段卷積中使用“重疊保留(Overlap-Save)”的處理方式,這里我們續(xù)集,說(shuō)明一下“重疊相加(Overlap-Add)”的處理方式。 信號(hào)處理在時(shí)域和頻域中處理是有差異的。 說(shuō)得通俗一點(diǎn)就是:時(shí)域中處理是直接用采集到的信號(hào)進(jìn)行計(jì)算;而頻域中則要用離散傅里葉變換(DFT)/離散傅里葉反變換(IDFT)對(duì)采集到的信號(hào)進(jìn)行轉(zhuǎn)換到頻域,然后再?gòu)念l域轉(zhuǎn)回時(shí)域處理。

在我們看到的參考文檔[1]中,描述的是在頻域進(jìn)行DFT,然后由IDFT轉(zhuǎn)回時(shí)域處理的過(guò)程。如下圖所示。大概的過(guò)程是:

每次處理的數(shù)據(jù)長(zhǎng)度為L(zhǎng),然后在每分段的尾部添加(M-1)個(gè)0之后,讓每次處理的數(shù)據(jù)序列長(zhǎng)度N=L+M-1,通常N為2的冪次倍;

同時(shí)對(duì)于濾波器,也需要將原來(lái)長(zhǎng)度為b的序列,通過(guò)填0的方式增加到長(zhǎng)度為N;

由DFT將兩個(gè)數(shù)列分別轉(zhuǎn)換到頻域,相乘后,再I(mǎi)DFT轉(zhuǎn)回時(shí)域,就得到N=(L+M-1)的時(shí)域卷積結(jié)果;

保留每次操作的所有數(shù)據(jù),然后在下一次操作結(jié)束后,將最新數(shù)據(jù)的最前面的(M-1)個(gè)結(jié)果數(shù)據(jù)和上一次結(jié)果數(shù)據(jù)的最后(M-1)個(gè)數(shù)據(jù)順序相加......持續(xù)直至結(jié)束。

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

FIR頻域的重疊相加示意圖

我們看看時(shí)域的卷積應(yīng)該怎么操作。

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

FIR時(shí)域重疊相加操作示意圖

如上圖所示:

每次讀取長(zhǎng)為L(zhǎng)的數(shù)據(jù)序列,然后與長(zhǎng)度為M的濾波器進(jìn)行卷積,生成一個(gè)(L+M-1)的卷積結(jié)果序列;

保留每次操作的所有數(shù)據(jù),然后在下一次操作結(jié)束后,將最新數(shù)據(jù)的最前面的(M-1)個(gè)結(jié)果數(shù)據(jù)和上一次結(jié)果數(shù)據(jù)的最后(M-1)個(gè)數(shù)據(jù)順序相加......持續(xù)直至結(jié)束。

兩個(gè)過(guò)程看起來(lái)略有差異,甚至?xí)X(jué)得時(shí)域的處理更簡(jiǎn)單省事,會(huì)不會(huì)更省時(shí)?其實(shí)頻域看起來(lái)費(fèi)時(shí),但數(shù)據(jù)規(guī)模到了一定程度之后,頻域的處理速度就具有優(yōu)勢(shì)了。然而對(duì)于一般的應(yīng)用,直接卷積操作還是可以接受的。

還記得上次我們提到Python中卷積函數(shù)np.convolve的三種模式吧?該函數(shù)對(duì)卷積是在時(shí)域中進(jìn)行的。

在Python中,卷積函數(shù)np.convolve(data_segment, b, mode)對(duì)指定長(zhǎng)度的數(shù)據(jù)data_segment(長(zhǎng)度L),和FIR濾波器系數(shù)序列b(長(zhǎng)度M)進(jìn)行卷積。輸出的結(jié)果序列則分為以下三種:

full:結(jié)果長(zhǎng)度=M+L-1

same:結(jié)果長(zhǎng)度=max(M,L)

valid:結(jié)果長(zhǎng)度=max(M,L)-min(M,L)+1=L-(M-1)

在這里,我們需要選用full模式,這樣就獲取每段卷積一個(gè)不落的所有數(shù)據(jù)(L+M-1)。先看模擬效果后看Python代碼。 故事情節(jié)設(shè)定:50Hz的信號(hào)中,夾雜300,450Hz的干擾。濾除干擾。

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

FIR選頻濾波器的幅頻響應(yīng)

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

FIR系統(tǒng)重疊相加的濾波結(jié)果示意圖

這里要特別說(shuō)明一點(diǎn):卷積后的數(shù)據(jù)長(zhǎng)度,最終會(huì)比原來(lái)的數(shù)多出(M-1)個(gè),所以輸出到圖的時(shí)候,需要有意控制長(zhǎng)度。 濾波過(guò)程中要經(jīng)歷“熱身”,所以最開(kāi)始階段有(M-1)個(gè)數(shù)據(jù)也是可以剔除的。同樣,如果我們看卷積最終結(jié)果尾部不處理,也有(M-1)個(gè)無(wú)效數(shù)據(jù)的輸出需要截取。

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

卷積后尾部無(wú)效數(shù)據(jù)(M-1)

上代碼,我們自己在代碼中劃重點(diǎn),并調(diào)整輸出結(jié)果的有效長(zhǎng)度范圍:

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


# 創(chuàng)建帶通濾波器
f1 = 40
f2 = 60
filter_len = 80     # 濾波器長(zhǎng)度
fs = 1600           # 采樣頻率維持不變


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


# 設(shè)置數(shù)據(jù)長(zhǎng)度
seg_filter_len = 256                            # filter output length of each segment data
segment_len = seg_filter_len - filter_len + 1   # 分段數(shù)據(jù)目標(biāo)長(zhǎng)度 seg_filter_len = segment_len + filter_len - 1
target_length = segment_len * 50                # 總數(shù)據(jù)長(zhǎng)度


# 而新的時(shí)間序列的上限 b
bspace = target_length / fs


# 生成的時(shí)間序列為L(zhǎng)的整數(shù)倍,模擬每次采樣的數(shù)據(jù)的長(zhǎng)度
t = np.arange(0, bspace, 1/fs)


# 產(chǎn)生一個(gè)含有300Hz,450Hz和50Hz信號(hào)的模擬信號(hào)
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模式用于保留所有卷積結(jié)果 N = L + M -1
    filtered_signals[i*segment_len:i*segment_len+len(filtered_segment)] += filtered_segment # 疊加過(guò)程


filtered_signals = filtered_signals#[:target_length] # 保留和原信號(hào)等長(zhǎng)的部分


#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)) # 標(biāo)幺,繪制前一半
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)) # 標(biāo)幺,繪制前一半
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()

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 數(shù)字濾波器
    +關(guān)注

    關(guān)注

    4

    文章

    270

    瀏覽量

    47026
  • FIR
    FIR
    +關(guān)注

    關(guān)注

    4

    文章

    146

    瀏覽量

    33174
  • 信號(hào)
    +關(guān)注

    關(guān)注

    11

    文章

    2791

    瀏覽量

    76771

原文標(biāo)題:數(shù)字濾波器(5)—FIR連續(xù)采樣分段卷積時(shí)域重疊相加法

文章出處:【微信號(hào):安費(fèi)諾傳感器學(xué)堂,微信公眾號(hào):安費(fèi)諾傳感器學(xué)堂】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    運(yùn)算放大器的同相加法器和反相加法

      運(yùn)算放大器構(gòu)成加法器 可以分為同相加法器和反相加法
    發(fā)表于 08-05 17:17 ?3.1w次閱讀
    運(yùn)算放大器的同<b class='flag-5'>相加法</b>器和反<b class='flag-5'>相加法</b>器

    求函數(shù)計(jì)算序列線(xiàn)性卷積結(jié)果

    定義一個(gè)函數(shù)文件,功能是采用重疊相加法完成無(wú)限長(zhǎng)序列與有限長(zhǎng)序列的線(xiàn)性卷積,然后用該函數(shù)文件計(jì)算序列x[k]=2k+1,0≤k≤18與序列h[k]={1,2,3,4;k=0,1,2,3}的線(xiàn)性
    發(fā)表于 11-29 13:36

    畢業(yè)設(shè)計(jì)_分段卷積MATLAB仿真與DSP實(shí)現(xiàn)

    相加法重疊保留法。每種方法先對(duì)輸入序列進(jìn)行分段,再將各段進(jìn)行快速傅里葉變換,接著進(jìn)行傅里葉逆變換得到各段輸出,將輸出結(jié)果進(jìn)行處理就得到了最終結(jié)果
    發(fā)表于 12-25 13:43

    采樣的頻域效應(yīng)解析

    來(lái)看看?! ∈紫纫涀〉氖牵?b class='flag-5'>時(shí)域信號(hào)相乘相當(dāng)于頻域卷積。因此,我們可以通過(guò)將原始信號(hào)的傅立葉變換與增量函數(shù)的傅立葉變換進(jìn)行卷積,從而得到采樣信號(hào)的傅立葉變換?! ∈聦?shí)證明,增量函數(shù)的傅
    發(fā)表于 09-02 17:42

    相加法電路(由LF155組成的)

    相加法電路(由LF155組成的)
    發(fā)表于 01-21 14:16 ?5060次閱讀
    同<b class='flag-5'>相加法</b>電路(由LF155組成的)

    相加法電路

    相加法運(yùn)算電路為若干個(gè)輸入信號(hào)從集成運(yùn)放的反相輸入端引入,輸出信號(hào)為它們反相按比例放大的代數(shù)和。
    發(fā)表于 09-22 11:44 ?3327次閱讀
    反<b class='flag-5'>相加法</b>電路

    相加法器電路原理與同相加法器計(jì)算

    相加法器輸入阻抗高,輸出阻抗低 反相加法器輸入阻抗低,輸出阻抗高.加法器是一種數(shù)位電路,其可進(jìn)行數(shù)字的加法計(jì)算。當(dāng)選用同相加法器時(shí),如A輸
    發(fā)表于 09-13 17:23 ?5.8w次閱讀
    同<b class='flag-5'>相加法</b>器電路原理與同<b class='flag-5'>相加法</b>器計(jì)算

    運(yùn)算電路:同相加法運(yùn)算電路與反相加法運(yùn)算電路解析

    加法運(yùn)算電路能實(shí)現(xiàn)多個(gè)模擬量的求和運(yùn)算。圖1所示為一個(gè)3個(gè)輸入信號(hào)的反相加法運(yùn)算電路。
    發(fā)表于 05-15 09:41 ?21.1w次閱讀
    運(yùn)算電路:同<b class='flag-5'>相加法</b>運(yùn)算電路與反<b class='flag-5'>相加法</b>運(yùn)算電路解析

    加法器與減法器_反相加法器與同相加法

    加法器是產(chǎn)生數(shù)的和的裝置。加數(shù)和被加數(shù)為輸入,和數(shù)與進(jìn)位為輸出的裝置為半加器。減法電路是基本集成運(yùn)放電路的一種,減法電路可以由反相加法電路構(gòu)成,也可以由差分電路構(gòu)成?;炯蛇\(yùn)放電路有加、減、積分和微分等四種運(yùn)算。一般是由集成運(yùn)放外加反饋網(wǎng)絡(luò)所構(gòu)成的運(yùn)算電路來(lái)實(shí)現(xiàn)。
    發(fā)表于 08-16 11:09 ?16.7w次閱讀
    <b class='flag-5'>加法</b>器與減法器_反<b class='flag-5'>相加法</b>器與同<b class='flag-5'>相加法</b>器

    連續(xù)時(shí)間系統(tǒng)時(shí)域分析的MATLAB實(shí)現(xiàn)

    掌握應(yīng)用 MATLAB 實(shí)現(xiàn)對(duì)線(xiàn)性時(shí)不變連續(xù)時(shí)間系統(tǒng)的時(shí)域分析,即熟悉應(yīng)用 MATLAB 實(shí)現(xiàn)微分方程的求解、連續(xù)時(shí)間信號(hào)卷積計(jì)算等。
    發(fā)表于 11-10 08:00 ?0次下載
    <b class='flag-5'>連續(xù)</b>時(shí)間系統(tǒng)<b class='flag-5'>時(shí)域</b>分析的MATLAB實(shí)現(xiàn)

    相加法器的應(yīng)用領(lǐng)域

    相加法器(又稱(chēng)為同相組合器、輸入能量合成器、同相求和器)是一種電子電路器件,主要應(yīng)用在通信、信號(hào)處理、調(diào)試和測(cè)量等領(lǐng)域。
    的頭像 發(fā)表于 06-06 17:21 ?1570次閱讀
    同<b class='flag-5'>相加法</b>器的應(yīng)用領(lǐng)域

    實(shí)用電路分享-同相加法

    相加法器(又稱(chēng)為同相組合器、輸入能量合成器、同相求和器)是一種電子電路器件,主要應(yīng)用在通信、信號(hào)處理、調(diào)試和測(cè)量等領(lǐng)域。
    的頭像 發(fā)表于 06-13 14:53 ?1.1w次閱讀
    實(shí)用電路分享-同<b class='flag-5'>相加法</b>器

    什么是反相加法運(yùn)算電路?反相加法運(yùn)算電路與減法運(yùn)算電路

    在電子技術(shù)的海洋中,有一種電路如同數(shù)學(xué)中的加法器一樣,能夠?qū)⒉煌男盘?hào)進(jìn)行相加處理。這就是被廣泛應(yīng)用于信號(hào)處理領(lǐng)域的反相加法運(yùn)算電路。
    的頭像 發(fā)表于 02-17 15:34 ?4660次閱讀
    什么是反<b class='flag-5'>相加法</b>運(yùn)算電路?反<b class='flag-5'>相加法</b>運(yùn)算電路與減法運(yùn)算電路

    相加法器和反相加法器的區(qū)別是什么

    相加法器和反相加法器是運(yùn)算放大器在模擬電路設(shè)計(jì)中常用的兩種基本電路結(jié)構(gòu),它們?cè)谛盘?hào)處理方面有著不同的特性和應(yīng)用場(chǎng)景。
    的頭像 發(fā)表于 05-23 14:35 ?2602次閱讀

    FIR頻域重疊相加法

    傳感器和信號(hào)處理僅一線(xiàn)之隔,信號(hào)的前后端合理搭配,是我們更準(zhǔn)確地感知這個(gè)世界的一種基本態(tài)度和方式。
    的頭像 發(fā)表于 09-09 11:29 ?487次閱讀
    <b class='flag-5'>FIR</b>頻域<b class='flag-5'>重疊</b><b class='flag-5'>相加法</b>