C++實(shí)現(xiàn)Matlab的zp2tf函數(shù)的示例代碼
更新時(shí)間:2023年04月20日 09:16:49 作者:胡剛2016
matlab?的?zp2tf?函數(shù)的作用是將極點(diǎn)形式的?H(s)?函數(shù)的分母展開(kāi),本文主要為大家介紹了C++實(shí)現(xiàn)Matlab的zp2tf函數(shù)示例代碼,需要的可以參考一下
1. matlab 的 zp2tf 函數(shù)的作用
作用是將極點(diǎn)形式的 H(s) 函數(shù)的分母展開(kāi)
2. matlab 的 zp2tf 函數(shù)的使用方法
[z, p, k]=buttap(4); disp("零點(diǎn):"+z); disp("極點(diǎn):"+p); disp("增益:"+k); [Bap,Aap]=zp2tf(z,p,k);% 由零極點(diǎn)和增益確定歸一化Han(s)系數(shù) disp("Bap="+Bap); disp("Aap="+Aap);
3. C++實(shí)現(xiàn)
3.1 complex.h 文件
#pragma once #include <iostream> typedef struct Complex { double real;// 實(shí)數(shù) double img;// 虛數(shù) Complex() { real = 0.0; img = 0.0; } Complex(double r, double i) { real = r; img = i; } }Complex; /*復(fù)數(shù)乘法*/ int complex_mul(Complex* input_1, Complex* input_2, Complex* output) { if (input_1 == NULL || input_2 == NULL || output == NULL) { std::cout << "complex_mul error!" << std::endl; return -1; } output->real = input_1->real * input_2->real - input_1->img * input_2->img; output->img = input_1->real * input_2->img + input_1->img * input_2->real; return 0; }
3.2 zp2tf.h 文件
#pragma once #include <iostream> #include <math.h> #include <vector> #include "complex.h" #define pi ((double)3.141592653589793) using namespace std; pair<Complex*, int> pair_mul(pair<Complex*, int> p1, pair<Complex*, int> p2) { pair<Complex*, int> result; Complex* new_coeff = (Complex*)malloc(sizeof(Complex)); int ret = complex_mul(p1.first, p2.first, new_coeff); if (ret == -1) { cout << "pair_mul error!" << endl; return result; } int new_pow = p1.second + p2.second; result.first = new_coeff; result.second = new_pow; return result; } vector<pair<Complex*, int>> element_mul(vector<pair<Complex*, int>> element1, vector<pair<Complex*, int>> element2) { vector<pair<Complex*, int>> result; if (element1.size() <= 0 || element2.size() <= 0) { cout << "element_mul error!" << endl; return result; } for (int i = 0; i < element1.size(); i++) { pair<Complex*, int> p1 = element1[i]; pair<Complex*, int> p; for (int j = 0; j < element2.size(); j++) { pair<Complex*, int> p2 = element2[j]; p = pair_mul(p1, p2); if (result.size() == 0) { result.push_back(p); } else { bool merge_flg = false; for (int k = 0; k < result.size(); k++) { // 如果指數(shù)一樣,就合并 if (result[k].second == p.second) { result[k].first->real += p.first->real; result[k].first->img += p.first->img; free(p.first); p.first = NULL; p.second = 0; merge_flg = true; break; } } if (!merge_flg) { result.push_back(p); } } } } return result; } vector<pair<Complex*, int>> zp2tf(vector<Complex*> poles) { vector<pair<Complex*, int>> tf; // pair 的 first代表極點(diǎn)形式H(s)的分母展開(kāi)后的每一項(xiàng)的系數(shù),second 代表每一項(xiàng)的指數(shù) if (poles.size() <= 0) { return tf; } // 先構(gòu)造 n 個(gè) (s-極點(diǎn)) vector<vector<pair<Complex*, int>>> elements(poles.size()); for (int i = 0; i < poles.size(); i++) { vector<pair<Complex*, int>> element; pair<Complex*, int> e1; Complex* c1 = (Complex*)malloc(sizeof(Complex)); c1->real = -1.0 * poles[i]->real; c1->img = -1.0 * poles[i]->img; e1 = make_pair(c1, 0);// -1.0 * 極點(diǎn) element.push_back(e1); pair<Complex*, int> e2; Complex* c2 = (Complex*)malloc(sizeof(Complex)); c2->real = 1.0; c2->img = 0.0; e2 = make_pair(c2, 1);// s element.push_back(e2); elements[i] = element; } if (elements.size() == 1) { return elements[0]; } // 再將 n 個(gè) (s-極點(diǎn)) 乘起來(lái) vector<pair<Complex*, int>> element = elements[0]; for (int i = 1; i < poles.size(); i++) { vector<pair<Complex*, int>> result = element_mul(element, elements[i]); if (result.size() <= 0) { return tf; } element = result; } return element; }
4. 測(cè)試結(jié)果
4.1 測(cè)試文件
#include <stdio.h> #include <stdlib.h> #include <math.h> #include <vector> #include "buttap.h" #include "zp2tf.h" using namespace std; #define pi ((double)3.141592653589793) int main() { vector<Complex*> poles = buttap(4); for (int i = 0; i < poles.size(); i++) { printf("%.15lf, %.15lf\n", poles[i]->real, poles[i]->img); } vector<pair<Complex*, int>> tf = zp2tf(poles); return 0; }
4.2 測(cè)試結(jié)果
3階模擬低通巴特沃斯濾波器
8階模擬低通巴特沃斯濾波器
結(jié)果與 matlab 均一致,大家可以自行驗(yàn)證
以上就是C++實(shí)現(xiàn)Matlab的zp2tf函數(shù)的示例代碼的詳細(xì)內(nèi)容,更多關(guān)于C++實(shí)現(xiàn)Matlab zp2tf函數(shù)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
C++ OpenCV讀寫(xiě)XML或YAML文件的方法詳解
XML是一種元標(biāo)記語(yǔ)言。所謂元標(biāo)記,就是開(kāi)發(fā)者可以根據(jù)自身需要定義自己的標(biāo)記。YAML是一個(gè)可讀性高,用來(lái)表達(dá)資料序列的格式。本文將通過(guò)C++和OpenCV實(shí)現(xiàn)這兩種文件的讀寫(xiě),需要的可以參考一下2022-05-05