iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++实现Matlab的zp2tf函数的示例代码
  • 717
分享到

C++实现Matlab的zp2tf函数的示例代码

摘要

目录1. matlab 的 zp2tf 函数的作用2. matlab 的 zp2tf 函数的使用方法3. c++实现3.1 complex.h 文件3.2 zp2tf.h 文件4.

1. matlab 的 zp2tf 函数的作用

作用是将极点形式的 H(s) 函数的分母展开

2. matlab 的 zp2tf 函数的使用方法

[z, p, k]=buttap(4);
disp("零点:"+z);
disp("极点:"+p);
disp("增益:"+k);

[Bap,Aap]=zp2tf(z,p,k);% 由零极点和增益确定归一化Han(s)系数
disp("Bap="+Bap);
disp("Aap="+Aap);

3. C++实现

3.1 complex.h 文件

#pragma once
#include <iOStream>

typedef struct Complex
{
	double real;// 实数
	double img;// 虚数

	Complex()
	{
		real = 0.0;
		img = 0.0;
	}

	Complex(double r, double i)
	{
		real = r;
		img = i;
	}
}Complex;


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++)
				{
					// 如果指数一样,就合并
					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代表极点形式H(s)的分母展开后的每一项的系数,second 代表每一项的指数
	if (poles.size() <= 0)
	{
		return tf;
	}

	// 先构造 n 个 (s-极点)
	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 * 极点
		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 个 (s-极点) 乘起来
	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. 测试结果

4.1 测试文件

#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 测试结果

3阶模拟低通巴特沃斯滤波器

8阶模拟低通巴特沃斯滤波器

结果与 matlab 均一致,大家可以自行验证

以上就是C++实现Matlab的zp2tf函数的示例代码的详细内容,更多关于C++实现Matlab zp2tf函数的资料请关注编程网其它相关文章!

--结束END--

本文标题: C++实现Matlab的zp2tf函数的示例代码

本文链接: https://www.lsjlt.com/news/210399.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • c语言怎么计算字符串长度
    在C语言中,可以使用内置的strlen()函数来计算字符串的长度。该函数位于string.h头文件中。以下是一个示例代码: #inc...
    99+
    2024-05-14
    c语言
  • c语言怎么判断三个数的大小
    可以通过比较三个数之间的大小关系来判断它们的大小。以下是一个示例代码: #include <stdio.h> int ...
    99+
    2024-05-14
    c语言
  • c++排序函数sort怎么使用
    在C++中,使用sort函数对容器中的元素进行排序,可以按照默认的升序排列,也可以自定义排序规则。 下面是一个简单的例子,对一个ve...
    99+
    2024-05-14
    c++
  • c++中string的compare函数怎么使用
    在C++中,可以使用string的compare函数来比较两个string对象的大小。该函数的原型如下: int compare(c...
    99+
    2024-05-14
    c++
  • c++中string的compare函数有什么用
    c++中string的compare函数用于比较两个字符串的大小关系。该函数返回一个整数值,表示两个字符串的比较结果。 具体来说,如...
    99+
    2024-05-14
    c++
  • c++中print函数的功能有哪些
    在C++中,通常使用std::cout来进行输出操作,而不是使用print函数。std::cout是C++标准库中的一个输出流对象,...
    99+
    2024-05-14
    c++
  • c语言数据结构怎么使用
    在C语言中,数据结构可以通过定义结构体来实现。以下是一些常见的数据结构的使用方法示例: 链表: #include <std...
    99+
    2024-05-14
    c语言
  • c++中print函数的用法是什么
    在C++中没有内置的print函数,但可以使用cout来输出内容到控制台。cout是C++标准库中的一个输出流对象,可以使用<...
    99+
    2024-05-14
    c++
  • c++中concept的用法是什么
    在C++20中,Concept是一种新的语言特性,用于定义类型要求和约束。Concept可以被用来约束函数模板、类模板和普通函数的参...
    99+
    2024-05-14
    c++
  • c++中concept的作用是什么
    在C++中,concept的作用是定义一种通用的约束,用于限制模板参数的类型范围。通过使用concept,可以在编译时对模板参数进行...
    99+
    2024-05-14
    c++
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作