欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C++實現(xiàn)Matlab的zp2tf函數(shù)的示例代碼

 更新時間:2023年04月20日 09:16:49   作者:胡剛2016  
matlab?的?zp2tf?函數(shù)的作用是將極點形式的?H(s)?函數(shù)的分母展開,本文主要為大家介紹了C++實現(xiàn)Matlab的zp2tf函數(shù)示例代碼,需要的可以參考一下

1. matlab 的 zp2tf 函數(shù)的作用

作用是將極點形式的 H(s) 函數(shù)的分母展開

2. matlab 的 zp2tf 函數(shù)的使用方法

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

[Bap,Aap]=zp2tf(z,p,k);% 由零極點和增益確定歸一化Han(s)系數(shù)
disp("Bap="+Bap);
disp("Aap="+Aap);

3. C++實現(xiàn)

3.1 complex.h 文件

#pragma once
#include <iostream>

typedef struct Complex
{
	double real;// 實數(shù)
	double img;// 虛數(shù)

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

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

/*復數(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代表極點形式H(s)的分母展開后的每一項的系數(shù),second 代表每一項的指數(shù)
	if (poles.size() <= 0)
	{
		return tf;
	}

	// 先構(gòu)造 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. 測試結(jié)果

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 測試結(jié)果

3階模擬低通巴特沃斯濾波器

8階模擬低通巴特沃斯濾波器

結(jié)果與 matlab 均一致,大家可以自行驗證

以上就是C++實現(xiàn)Matlab的zp2tf函數(shù)的示例代碼的詳細內(nèi)容,更多關(guān)于C++實現(xiàn)Matlab zp2tf函數(shù)的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • C語言打印某一年中某月的日歷

    C語言打印某一年中某月的日歷

    本文詳細講解了C語言打印某一年中某月的日歷,文中通過示例代碼介紹的非常詳細。對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-12-12
  • C++利用libcurl獲取下載文件名稱及大小

    C++利用libcurl獲取下載文件名稱及大小

    這篇文章主要為大家詳細介紹了C++如何利用libcurl獲取下載文件名稱及大小的功能,文中的示例代碼講解詳細,感興趣的小伙伴可以了解一下
    2023-03-03
  • C語言中的rand()和rand_r()詳解

    C語言中的rand()和rand_r()詳解

    這篇文章主要為大家介紹了C語言中的rand()和rand_r(),具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2021-12-12
  • C++文件讀寫操作詳解

    C++文件讀寫操作詳解

    本文詳細講解了C++讀寫文件的方法,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-04-04
  • Qt使用QWT繪制柱狀圖詳解

    Qt使用QWT繪制柱狀圖詳解

    QT中提供了一個叫做QWT的庫。QWT,全稱是Qt?Widgets?for?Technical?Applications,是一個基于LGPL版權(quán)協(xié)議的開源項目,可生成各種統(tǒng)計圖。本文將通過它繪制柱狀圖,需要的可以參考一下
    2022-01-01
  • c語言B樹深入理解

    c語言B樹深入理解

    B樹是為磁盤或其他直接存儲設(shè)備設(shè)計的一種平衡查找樹,本文將詳細介紹c語言B樹,需要的朋友可以參考下
    2012-11-11
  • C++ OpenCV讀寫XML或YAML文件的方法詳解

    C++ OpenCV讀寫XML或YAML文件的方法詳解

    XML是一種元標記語言。所謂元標記,就是開發(fā)者可以根據(jù)自身需要定義自己的標記。YAML是一個可讀性高,用來表達資料序列的格式。本文將通過C++和OpenCV實現(xiàn)這兩種文件的讀寫,需要的可以參考一下
    2022-05-05
  • C中的volatile使用方法

    C中的volatile使用方法

    volatile 影響編譯器編譯的結(jié)果,指出,volatile 變量是隨時可能發(fā)生變化的,與volatile變量有關(guān)的運算,不要進行編譯優(yōu)化,以免出錯
    2013-02-02
  • C語言零基礎(chǔ)徹底掌握預處理上篇

    C語言零基礎(chǔ)徹底掌握預處理上篇

    在C語言的程序中包括各種以符號#開頭的編譯指令,這些指令稱為預處理命令。預處理命令屬于C語言編譯器,而不是C語言的組成部分,通過預處理命令可擴展C語言程序設(shè)計的環(huán)境
    2022-08-08
  • C語言 基本語法示例講解

    C語言 基本語法示例講解

    本篇文章主要講解C語言 基本語法,這里提供簡單的示例和代碼來詳細講解C語言的基本語法,開始學習C語言的朋友可以看一下
    2016-08-08

最新評論