C++實(shí)現(xiàn)Matlab的zp2tf函數(shù)的示例代碼
更新時(shí)間:2023年04月20日 09:16:49 作者:胡剛2016
matlab?的?zp2tf?函數(shù)的作用是將極點(diǎn)形式的?H(s)?函數(shù)的分母展開,本文主要為大家介紹了C++實(shí)現(xiàn)Matlab的zp2tf函數(shù)示例代碼,需要的可以參考一下
1. matlab 的 zp2tf 函數(shù)的作用
作用是將極點(diǎn)形式的 H(s) 函數(shù)的分母展開
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)的分母展開后的每一項(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)) 乘起來
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)文章!

