一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

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

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

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

FIR頻域重疊相加法

安費(fèi)諾傳感器學(xué)堂 ? 來源:安費(fèi)諾傳感器學(xué)堂 ? 2024-09-09 11:29 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

[編者按]傳感器信號(hào)處理僅一線之隔,信號(hào)的前后端合理搭配,是我們更準(zhǔn)確地感知這個(gè)世界的一種基本態(tài)度和方式。

FIR頻域重疊相加法

還記得我們(此處有重復(fù)之嫌)之前的發(fā)文《FIR連續(xù)采樣分段卷積時(shí)域重疊相加法》?不過那是在時(shí)域處理的模擬仿真。這次我們的內(nèi)容是用C++在頻域?qū)崿F(xiàn)的濾波卷積法,仍然是重疊相加法,屆時(shí)大家可以比較一下兩種方式的差異。

基本是通過兩個(gè)處理過程。

(1)頻域的重疊相加法示意圖再拿來用一下。如下圖所示[1]。

image.png

(2)再借用一下的時(shí)域卷積經(jīng)傅里葉FFT變換后,在頻域成為對(duì)應(yīng)的相乘;然后再通過IFFT將中間結(jié)果轉(zhuǎn)換回時(shí)域時(shí)序結(jié)果。

image.png

讓我們直接跳進(jìn)話題,先看模擬測(cè)試結(jié)果,后看C++源碼。

模擬情節(jié)設(shè)定

50Hz選頻濾波,信號(hào)中混有110Hz和210H在的干擾信號(hào)和幅值為1的直流DC

模擬信號(hào)及其頻譜的輸出請(qǐng)查看我們前面的文章。這里的代碼只提供將模擬信號(hào)進(jìn)行了頻域重疊相加處理,生成的濾波前后模擬信號(hào)和被濾波處理后的數(shù)據(jù)波形的比較(見下圖)。

還記得我們(此處重復(fù))之前用C++來模擬時(shí)域處理的濾波模擬程序嗎?

你又猜對(duì)了,又是那個(gè)濾波器,又被用上了!但,是不同的實(shí)現(xiàn)處理方式。

image.png

濾波處理之前的波形和頻譜圖

濾波之后,直流和其他頻率的信號(hào)已經(jīng)不見,只留下50Hz的正弦波(見下圖)。

image.png

頻域重疊相加濾波前后的波形比較

圖由csv文件處理后生成。又見此圖,是不是有熟悉的感覺?

頻域連續(xù)濾波模擬和驗(yàn)證C++源碼

/*
Project Name: Demonstration & Validation for signal filtering via the 
"Overlap-Add" method implemented through FFT/IFFT based on Fast Fourier Transform (FFT)
based on the Cooley-Tukey algorithm.
Copyright(c)2024AmphenolSensors
Author: L.L.


This software is provided 'as-is', without any express or implied
warrantyandforsimulation/demostrationpurpose.Innoeventwilltheauthorsbeheldliableforanydamages
arising from the use of this software.


Permission is granted to anyone to use this software for any purpose,
including commercial applications, and to alter it and redistribute it
freely, subject to the following restrictions:


The origin of this software must not be misrepresented; you must not
claim that you wrote the original software. If you use this software
in a product, an acknowledgment in the product documentation would be
appreciated but is not required.
*/
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 


const double PI = 3.1415926535897932384;
const double SAMPLE_RATE = 1000.0;      // 1000Hz
const int N = 1024;                     // 假設(shè)采樣分段數(shù)為1024


using namespace std; // 聲明使用std命名空間


#define SEL_FFT     0
#define SEL_IFFT    1
#define SEL_FFTIFFT 2


#define SIM_CYCLE_CNT   3.0


// 模擬信號(hào)函數(shù)
vector> generateSignal(double sampleRate, double seconds)
{
    size_t signal_len = (size_t)(sampleRate * seconds);
    vector> signal(signal_len); // 定義模擬信號(hào)的數(shù)組長(zhǎng)度
    for (size_t i = 0; i < signal_len; ++i)
    {
        // 包含50Hz和110Hz,210Hz信號(hào),DC
        signal[i].real(1+ sin((2 * PI * (double)i * 50) / sampleRate) + sin((2 * PI * (double)i * 210) / sampleRate) + sin((2 * PI * (double)i * 110) / sampleRate));
        signal[i].imag(0);
    }
    return signal;
}


// 基于Cooley-Tukey算法的FFT
void fft2(vector> &x)
{
    size_t n = x.size();
    if (n <= 1)
        return;


    // 把序列分為奇偶兩部分
    vector> even(n / 2), odd(n / 2);
    for (size_t i = 0; 2 * i < n; i++)
    {
        even[i] = x[i * 2];
        odd[i] = x[i * 2 + 1];
    }


    // 遞歸解決每一個(gè)序列
    fft2(even);
    fft2(odd);


    // 結(jié)合步驟
    for (size_t i = 0; 2 * i < n; i++)
    {
        complex t = polar(1.0, -2 * PI * (double)i / (double)n) * odd[i];
        x[i] = even[i] + t;
        x[i + n / 2] = even[i] - t;
    }
}
// 基于Cooley-Tukey算法的IFFT
void ifft2(vector> &x)
{
    size_t n = x.size();
    if (n <= 1)
        return;


    vector> even(n / 2), odd(n / 2);
    for (size_t i = 0; 2 * i < n; i++)
    {
        even[i] = x[i * 2];
        odd[i] = x[i * 2 + 1];
    }


    ifft2(even);
    ifft2(odd);


    for (size_t i = 0; 2 * i < n; i++)
    {
        complex t = polar(1.0, 2 * PI * (double)i /(double) n) * odd[i];
        x[i] = even[i] + t;
        x[i + n / 2] = even[i] - t;
    }
    // 最后除以n
    if (n > 1)
    {
        for (size_t i = 0; i < n; i++)
        {
            x[i] /= 2;
        }
    }
}


// 將數(shù)據(jù)寫入文件
void writeToFile(const vector> &Original_signal, const vector> &Proceeded_Signal, const string &filename, int Type_sel)
{
    ofstream file(filename);
    if (Type_sel==SEL_FFTIFFT)
    {
        file << "time(s)" << ", " << "Original Signal"<< ", " << "Filtered Signal" << "
";
        for (size_t i = 0; i < Original_signal.size(); i++)
        {
            file << (double)i / SAMPLE_RATE << ", " < b{0.0010175493084400998, 0.0010954624020866333, 0.001080635650435545, 0.0009293052645812359,
                   0.0005868808563577278, -8.138309855847798e-19, -0.0008644147524968251, -0.0019966389877814107,
                   -0.003323586744207458, -0.004696461345361978, -0.005892320462621699, -0.006633249964255378,
                   -0.006623614506478284, -0.005601944833604465, -0.0034001773970723163, -7.334366341273803e-18,
                   0.004425290874832446, 0.00949426225087417, 0.014634010415364655, 0.019132982942933127,
                   0.022226796444847933, 0.023207550009729024, 0.021541722692400025, 0.01697833945185371,
                   0.009628503914736117, -6.755395515820625e-18, -0.01102370844120733, -0.02226281209657117,
                   -0.032372473621654914, -0.04001099412924139, -0.04402269970024527, -0.043609484958132556,
                   -0.03846490807520255, -0.028848803480728435, -0.015588116829396594, -9.10410551538968e-18,
                   0.016255406162706088, 0.031374390998733945, 0.04363491329762711, 0.051616779739690075,
                   0.05438594145724075, 0.051616779739690075, 0.04363491329762711, 0.031374390998733945,
                   0.016255406162706088, -9.10410551538968e-18, -0.015588116829396594, -0.028848803480728435,
                   -0.03846490807520255, -0.043609484958132556, -0.04402269970024527, -0.0400109941292414,
                   -0.032372473621654914, -0.022262812096571168, -0.01102370844120733, -6.755395515820627e-18,
                   0.009628503914736117, 0.016978339451853702, 0.021541722692400025, 0.023207550009729034,
                   0.022226796444847933, 0.01913298294293312, 0.014634010415364655, 0.009494262250874175,
                   0.004425290874832446, -7.3343663412738e-18, -0.0034001773970723163, -0.005601944833604469,
                   -0.006623614506478284, -0.006633249964255374, -0.005892320462621699, -0.00469646134536198,
                   -0.003323586744207458, -0.001996638987781409, -0.0008644147524968251, -8.138309855847805e-19,
                   0.0005868808563577278, 0.0009293052645812359, 0.001080635650435545, 0.0010954624020866333,
                   0.0010175493084400998};


    // (1) Resize filter coefficients
    vector> H(b.size());


    for(size_t i=0; i< b.size(); i++)
    {
        H[i] = complex(b[i],0);
    }
    H.resize(N, complex(0.0, 0.0));


    // (2)Generate simulation data sequences
    size_t DataSeg_len_L = N - b.size() + 1;                // Data segmeng Length = L


    double daq_duration = (double)DataSeg_len_L * SIM_CYCLE_CNT / SAMPLE_RATE;
    vector>Original_signal = generateSignal(SAMPLE_RATE, daq_duration);     // Generate data sequence, L * 3


    // (3-1) Define a 2-D vector,3 columns, to simulate DAQ and filtering process for 3 rounds
    vector>> seg_Dates(3); 
    // (3-2) Initialize data segment
    for (size_t i = 0; i < seg_Dates.size(); i++)
    {
        seg_Dates[i].resize(DataSeg_len_L,complex(0.0, 0.0));
        // devide Original_signal into 3 parts to simulate consequent DAQ for 3 cycles
        for(size_t j=0; j(0.0, 0.0));                     // resize each data segment to N = L + M - 1
    }


    // (4) Start to FFT/IFFT and generate involution result
    vector> Filtered_signal(DataSeg_len_L * (size_t)(SIM_CYCLE_CNT) +  b.size() -1 );     //L * 3 + (M - 1)
    fft2(H);  


//(4-1)Simulate3cyclesofinvolution:L*3
    for(size_t i=0; i< seg_Dates.size(); i++)
    {
        fft2(seg_Dates[i]);
        for(size_t j = 0; j< seg_Dates[i].size(); j++)
        {
            seg_Dates[i][j] = seg_Dates[i][j] * H[j];
        }


        ifft2(seg_Dates[i]);
        for(size_t k = 0; k< seg_Dates[i].size(); k++)
        {
            Filtered_signal[i*DataSeg_len_L + k] += seg_Dates[i][k];
        }
    }


????//?(5)?Save?Origianl?signal & result?(data?after?filtering)?into?csv?file
    writeToFile(Original_signal, Filtered_signal,"output_Filtered2.csv", SEL_FFTIFFT);


    return 0;
}

時(shí)間倉(cāng)促,有些功能和細(xì)節(jié)并沒有考慮太多,這里功能驗(yàn)證是第一。

FFT/IFFT是基于庫(kù)里-圖基的算法,各位可以選用其他的來優(yōu)化替代;

有些參數(shù)可以單獨(dú)變,有些參數(shù)卻是關(guān)聯(lián)的。

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

    關(guān)注

    2565

    文章

    53008

    瀏覽量

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

    關(guān)注

    4

    文章

    151

    瀏覽量

    34266
  • 頻域
    +關(guān)注

    關(guān)注

    1

    文章

    91

    瀏覽量

    26625

原文標(biāo)題:數(shù)字濾波器(6)—FIR頻域連續(xù)濾波“重疊相加法”C++源碼

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

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

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

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

    什么是加法器?加法器的原理是什么 ?

    什么是加法器?加法器的原理是什么 反相加法器等效原理圖解析
    發(fā)表于 03-11 06:30

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

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

    相加法電路

    相加法運(yùn)算電路為若干個(gè)輸入信號(hào)從集成運(yùn)放的反相輸入端引入,輸出信號(hào)為它們反相按比例放大的代數(shù)和。
    發(fā)表于 09-22 11:44 ?3520次閱讀
    反<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 ?22w次閱讀
    運(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)算電路來實(shí)現(xiàn)。
    發(fā)表于 08-16 11:09 ?16.9w次閱讀
    <b class='flag-5'>加法</b>器與減法器_反<b class='flag-5'>相加法</b>器與同<b class='flag-5'>相加法</b>器

    相加法器原理圖與電路圖

    一、什么是加法加法器是為了實(shí)現(xiàn)加法的。即是產(chǎn)生數(shù)的和的裝置。加數(shù)和被加數(shù)為輸入,和數(shù)與進(jìn)位為輸出的裝置為半
    的頭像 發(fā)表于 03-16 15:57 ?2.2w次閱讀
    反<b class='flag-5'>相加法</b>器原理圖與電路圖

    相加法器EWB電路仿真的詳細(xì)資料免費(fèi)下載

    本文檔的主要內(nèi)容詳細(xì)介紹的是反相加法器EWB電路仿真的詳細(xì)資料免費(fèi)下載。
    發(fā)表于 09-21 15:38 ?12次下載
    反<b class='flag-5'>相加法</b>器EWB電路仿真的詳細(xì)資料免費(fèi)下載

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

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

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

    相加法器(又稱為同相組合器、輸入能量合成器、同相求和器)是一種電子電路器件,主要應(yīng)用在通信、信號(hào)處理、調(diào)試和測(cè)量等領(lǐng)域。
    的頭像 發(fā)表于 06-13 14:53 ?1.4w次閱讀
    實(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 ?7805次閱讀
    什么是反<b class='flag-5'>相加法</b>運(yùn)算電路?反<b class='flag-5'>相加法</b>運(yùn)算電路與減法運(yùn)算電路

    相加法運(yùn)算電路原理介紹

    相加法運(yùn)算電路利用運(yùn)算放大器(通常簡(jiǎn)稱為Op-Amp)的特性來實(shí)現(xiàn)多個(gè)輸入信號(hào)的加法運(yùn)算。每個(gè)輸入信號(hào)都通過一個(gè)電阻連接到運(yùn)算放大器的反相輸入端,而運(yùn)算放大器的同相輸入端則接地或虛擬接地。輸出電壓
    的頭像 發(fā)表于 01-31 15:53 ?5354次閱讀
    反<b class='flag-5'>相加法</b>運(yùn)算電路原理介紹

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

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

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

    在上一個(gè)文檔里,我們提到了FIR系統(tǒng)在時(shí)域的分段卷積中使用“重疊保留(Overlap-Save)”的處理方式,這里我們續(xù)集,說明一下“重疊相加(Overlap-Add)”的處理方式。
    的頭像 發(fā)表于 06-14 10:30 ?1873次閱讀
    <b class='flag-5'>FIR</b>連續(xù)采樣分段卷積時(shí)域<b class='flag-5'>重疊</b><b class='flag-5'>相加法</b>