1. 程式人生 > >計算數字濾波器的頻率響應 (2)

計算數字濾波器的頻率響應 (2)

將上次的程式用C++重寫了一遍。希望對大家有用。

下面是程式碼:

class IIR_BODE
{
private:
    double *m_pNum;
    double *m_pDen;
    int m_num_order;
    int m_den_order;
    complex<double> poly_val(double p[], int order, double omega);
public:
    IIR_BODE();
    void setPara(double num[], int num_order, double den[], int den_order);
    complex<double> bode(double omega);
    void bode(double omega[], int n, complex<double> resp[]);
};
IIR_BODE::IIR_BODE()
{
    m_pNum = NULL;
    m_pDen = NULL;
    m_num_order = -1;
    m_den_order = -1;
}

void IIR_BODE::setPara(double num[], int num_order, double den[], int den_order)
{
    delete[] m_pNum;
    delete[] m_pDen;
    m_pNum = new double[num_order + 1];
    m_pDen = new double[den_order + 1];
    m_num_order = num_order;
    m_den_order = den_order;
    for(int i = 0; i <= m_num_order; i++)
    {
        m_pNum[i] = num[i];
    }
    for(int i = 0; i <= m_den_order; i++)
    {
        m_pDen[i] = den[i];
    }
}
complex<double> IIR_BODE::bode(double omega)
{
    complex<double> h;
    h = poly_val(m_pNum, m_num_order, omega) / poly_val(m_pDen, m_den_order, omega);
    return h;
}
complex<double> IIR_BODE::poly_val(double p[], int order, double omega)
{
    complex<double> z, sum = 0.0;
    z = complex<double>( cos(omega), -sin(omega) );
    for (int i = order; i >= 0; i--)
    {
        sum = sum * z + p[i];
    }
    return sum;
}
void IIR_BODE::bode(double omega[], int n, complex<double> resp[])
{
    for(int i = 0; i < n; i++)
    {
        resp[i] = bode(omega[i]);
    }
}

下面是測試程式碼,測試的是一個4階切比雪夫低通濾波器的頻率響應:
#include <iostream>
#include <math.h>
using namespace std;

int main()
{
    double b[5] = {0.001836, 0.007344, 0.011016, 0.007344, 0.001836};
    double a[5] = {1.0, -3.0544, 3.8291, -2.2925, 0.55075};
    double argz, old_argz = 0, omega;
    complex<double> z;
    int len = 100;
    IIR_BODE bode;
    bode.setPara(b, 4, a, 4);
    
    for (int i = 0; i < len; i++)
    {
        omega = M_PI * i / (len);
        z = bode.bode(omega);
        argz = arg(z);
        argz = argz - round( (argz - old_argz) / M_PI ) * M_PI;
        old_argz = argz;
        cout << omega << ", " << abs(z) << ", " << argz << endl;
    }
}

程式很簡答,沒什麼值得多說的。不過倒是用到了個小技巧使得計算出的相頻曲線是連續的。


相關推薦

計算數字濾波器頻率響應 2

將上次的程式用C++重寫了一遍。希望對大家有用。 下面是程式碼: class IIR_BODE { private: double *m_pNum; double *m_pDen; int m_num_order; int m_den_ord

數字電視標準綜述2

信號源 努力 fec 業務 存在 帶寬 障礙 相關 接收 五、DVB與 ATSC的比較   歐洲“DVB標準”和美國“ATSC數字電視標準”的主要差別例如以下:   (1)方形像素:在ATSC標準中採納了“方形像素”(Square Picture Eelem

數字訊號處理專題2——利用FPGA進行基本運算及特殊函式定點運算

一、前言   FPGA以擅長高速並行資料處理而聞名,從有線/無線通訊到影象處理中各種DSP演算法,再到現今火爆的AI應用,都離不開卷積、濾波、變換等基本的數學運算。但由於FPGA的硬體結構和開發特性使得其對很多演算法不友好,之前本人零散地總結和轉載了些基本的數學運算在FPGA中的實現方式,今天做一個系統的總

從互聯網+角度看雲計算的現狀與未來2

大數據平臺 堅強 隱藏 用戶管理 圖像識別 都是 人工智能 大致 統計數據 此文已由作者劉超授權網易雲社區發布。歡迎訪問網易雲社區,了解更多網易技術產品運營經驗。六、業務架構趨勢一:互聯網沖擊已成必然,快速變更成為核心競爭力,DevOps重構組織架構,流程,文化是必然選擇在

從網際網路+角度看雲端計算的現狀與未來2

此文已由作者劉超授權網易雲社群釋出。歡迎訪問網易雲社群,瞭解更多網易技術產品運營經驗。六、業務架構趨勢一:網際網路衝擊已成必然,快速變更成為核心競爭力,DevOps重構組織架構,流程,文化是必然選擇在業務架構方面,我這裡強調的是服務化。是解決如何避免開發和運維的黑天鵝問題。所

濾波器設計2:經典FIR數字濾波器的設計

引言以前有一篇IIR濾波器設計的文章。與IIR相對應,這篇文章主要講FIR濾波器的設計。以下一段摘自百度百科。FIR(Finite Impulse Response)濾波器:有限長單位衝激響應濾波器,又稱為非遞迴型濾波器,是數字訊號處理系統中最基本的元件,它可以在保證任意幅頻

數據清洗小記2:全角數字轉換半角數字

大局觀 山東 轉載 亞洲 pop rpm包 stats mod 法律 原創作品。出自 “深藍的blog” 博客,歡迎轉載,轉載時請務必註明出處,否則有權追究版權法律責任。深藍的blog:http://blog.csdn.net/huangyanlong/article/d

shell腳本學習2比較兩個數字大小

$1 num centos7 錯誤 you equal shel 腳本 語句 註意:shell中對比字符串只能使用==、<、>、!=、-z、-n。對比字符串時,末尾一定要加上x(或者a、b等)一個字符,因為if [ $1x == "ab"x ]時如果沒有了x

計算beta分布並畫圖2

except ont cat pos 數據統計 文件內容 sta () actor import java.awt.Font; import java.awt.GridLayout; import java.io.BufferedReader; import java.i

2響應式流——響應式Spring的道法術器

響應式編程 Spring WebFlux 本系列文章索引:《響應式Spring的道法術器》。前情提要: 什麽是響應式編程 1.2 響應式流 上一節留了一個坑——為啥不用Java Stream來進行數據流的操作? 原因在於,若將其用於響應式編程中,是有局限性的。比如如下兩個需要面對的問題: Web

Vivado HLS實現FIR濾波器2——Vivado呼叫HLS生成的FIR IP核

系統框圖 器件xq7a50tfg484-2I,兩個DDS,輸入時鐘100MHz,輸出分別為8MHz和12MHz,位寬為16位,相乘後輸出位寬32位,三角函式積化和差得4MHz訊號和20MHz訊號,濾波器設計採用Filter Solutions 2015,截止頻率10MHz,取樣率10

Tensorflow之MNIST手寫數字識別:分類問題2

整體程式碼: #資料讀取 import tensorflow as tf import matplotlib.pyplot as plt import numpy as np from tensorflow.examples.tutorials.mnist import input_data mnis

新手上手Tensorflow之手寫數字識別應用2

本系列為應用TensorFlow實現手寫數字識別應用的全過程的程式碼實現及細節討論。按照實現流程,分為如下幾部分: 1. 模型訓練並儲存模型 2. 通過滑鼠輸入數字並儲存 2. 影象預處理 4. 讀入模型對輸入的圖片進行識別 本文重點討論模型的儲存以及讀入問題。 關於Tens

在實際的開發工作中,對字串的處理是最常見的程式設計任務。本題目即是要求程式對使用者輸入的串進行處理。具體規則如下: 1把每個單詞的首字母變為大寫。 (2)數字與字母之間用下劃線字元_分開,使得更

在實際的開發工作中,對字串的處理是最常見的程式設計任務。本題目即是要求程式對使用者輸入的串進行處理。具體規則如下: (1)把每個單詞的首字母變為大寫。 (2)把數字與字母之間用下劃線字元(_)分開,使得更清晰; (3)把單詞中間有多個空格的調整為1個空格。   &

流式大資料計算實踐2----Hadoop叢集和Zookeeper

一、前言 1、上一文搭建好了Hadoop單機模式,這一文繼續搭建Hadoop叢集 二、搭建Hadoop叢集 1、根據上文的流程得到兩臺單機模式的機器,並保證兩臺單機模式正常啟動,記得第二臺機器core-site.xml內的fs.defaultFS引數值要改成本機的來啟動,啟動完畢後再改回來 2、清空資

流式大數據計算實踐2----Hadoop集群和Zookeeper

nts 環境變量 技術 文件創建 con mon orm rm2 sam 一、前言 1、上一文搭建好了Hadoop單機模式,這一文繼續搭建Hadoop集群 二、搭建Hadoop集群 1、根據上文的流程得到兩臺單機模式的機器,並保證兩臺單機模式正常啟動,記得第二臺機器c

終於有人把雲端計算、大資料和人工智慧講明白了! 2

此文已由作者劉超授權網易雲社群釋出。 歡迎訪問網易雲社群,瞭解更多網易技術產品運營經驗。 3大資料時代,眾人拾柴火焰高 當資料量很小時,很少的幾臺機器就能解決。慢慢的,當資料量越來越大,最牛的伺服器都解決不了問題時,怎麼辦呢?這時就要聚合多臺機器的力量,大家齊心協力一起把這個事搞定,眾人拾柴火焰高。 對

tensorflow學習2計算圖,tf.get_default_graph(),tf.Graph()

一、基本概念 顧名思義,TensorFlow的名字已經出賣了它的“靈魂”,TensorFlow=tensor(張量)+flow(流動)。TensorFlow是一個通過計算圖的形式來表達計算的程式設計框架。其每一個計算都是計算圖上的一個節點,而節點之間的邊描述了計算之間的依賴關係。 計算圖

第10章 網路安全2_應用層安全(數字簽名)

3. 應用層安全——數字簽名 3.1 數字簽名 (1)數字簽名細節   ①A有一個金鑰對(A的私鑰SK和公鑰PK)。傳送檔案前先使用雜湊函式生成該檔案的摘要,再使用A的私鑰加密摘要(這個過程稱為簽名,私鑰持有者才能做這個操作)。   ②然後將加密後的摘要、A的公鑰和檔案(不加密

Leetcode題解之數學問題2 計算質數

題目:https://leetcode-cn.com/problems/count-primes/ 題目描述: 統計所有小於非負整數 n 的質數的數量。 示例: 輸入: 10 輸出: 4 解釋: 小於 10 的質數一共有 4 個, 它們是 2, 3, 5, 7 。