【C++/Python编程】c++调用python

参考:https://docs.python.org/3/c-api

https://blog.youkuaiyun.com/lingtianyulong/article/details/81146495

基础vs2015导入python包直接略过直接上代码:

c++代码:main.cpp

#include <Python.h>
#include <iostream>
#include <string>
using namespace std;

int main(int argc, char* argv[])

{
	//初始化python
	Py_Initialize();

	PyRun_SimpleString("import sys");
	//此处不能设置当前main函数的同级目录
	PyRun_SimpleString("sys.path.append('C:/Users/Administrator/Desktop')");
	//定义python类型的变量
	PyObject *pModule = NULL;
	PyObject *pFunc = NULL;
	PyObject *pArg = NULL;
	PyObject *result = NULL;
	PyObject *pClass = NULL;
	PyObject *pInstance = NULL;
	PyObject *pDict = NULL;
	//直接运行python代码
	PyRun_SimpleString("print('python start')");
	//引入模块
	pModule = PyImport_ImportModule("mytest2");
	//cout << "pModule:" << pModule << endl;
	if (!pModule)
	{
		cout << "Import Module Failed" << endl;
		//system("pause");
		return 0;
	}


	//获取模块字典属性
	pDict = PyModule_GetDict(pModule);

	直接获取模块中的函数
	pFunc = PyObject_GetAttrString(pModule, "hello");

	//参数类型转换,传递一个字符串。将c/c++类型的字符串转换为python类型,元组中的python类型查看python文档
	pArg = Py_BuildValue("(s)", "hello charity");
	// 调用直接获得的函数,并传递参数
	PyEval_CallObject(pFunc, pArg);

	//system("pause");
	// 第二种方式从字典属性中获取函数
	pFunc = PyDict_GetItemString(pDict, "arg");
	// 参数类型转换,传递两个整型参数
	pArg = Py_BuildValue("(i, i)", 1, 2);
	// 调用函数,并得到 python 类型的返回值
	result = PyEval_CallObject(pFunc, pArg);//注意:所有返回值都用PyObject指针对象接收
	// c 用来保存 C/C++ 类型的返回值
	int c = 0;
	// 将 python 类型的返回值转换为 C/C++类型
	PyArg_Parse(result, "i", &c);//对python返回值进行解析
	cout << "a+b = " << c << endl;

	// 通过字典属性获取模块中的类 
	pClass = PyDict_GetItemString(pDict, "Test");

	if (!pClass)
	{
		cout << "获取模块中的类失败" << endl;
		//system("pause");
		return 0;
	}

	// 实例化获取的类
	pInstance = PyInstanceMethod_New(pClass);

	//调用类的方法并传参
	result = PyObject_CallMethod(pInstance, "say_hello", "(s,s)", "", "charity");

	//输出返回值
	char* name = NULL;
	PyArg_Parse(result, "s", &name); 

	printf("%s\n", name);

	PyRun_SimpleString("print('python end')");

	释放python

	Py_Finalize();

	system("pause");

	return 0;

}

python代码:mytest2.py

def hello(s):
    #print("hello world")
    print(s)
 
 
def arg(a, b):
    #print('a=', a)
    #print('b=', b)
    return a + b
 
 
class Test:
    def __init__(self):
        print("init")
 
    def say_hello(self, name):
        #print("hello", name)
        return name

运行结果:

分数阶傅里叶变换(Fractional Fourier Transform, FRFT)是对传统傅里叶变换的拓展,它通过非整数阶的变换方式,能够更有效地处理非线性信号以及涉及时频局部化的问题。在信号处理领域,FRFT尤其适用于分析非平稳信号,例如在雷达、声纳和通信系统中,对线性调频(Linear Frequency Modulation, LFM)信号的分析具有显著优势。LFM信号是一种频率随时间线性变化的信号,因其具有宽频带和良好的时频分辨率,被广泛应用于雷达和通信系统。FRFT能够更精准地捕捉LFM信号的时间和频率信息,相比普通傅里叶变换,其性能更为出色。 MATLAB是一种强大的数值计算和科学计算工具,拥有丰富的函数库和用户友好的界面。在MATLAB中实现FRFT,通常需要编写自定义函数或利用信号处理工具箱中的相关函数。例如,一个名为“frft”的文件可能是用于执行分数阶傅里叶变换的MATLAB脚本或函数,并展示其在信号处理中的应用。FRFT的正确性验证通常通过对比变换前后信号的特性来完成,比如评估信号的重构质量、信噪比等。具体而言,可以通过计算原始信号与经过FRFT处理后的信号之间的相似度,或者对比LFM信号的关键参数(如初始频率、扫频率和持续时间)是否在变换后得到准确恢复。 在MATLAB代码实现中,通常包含以下步骤:首先,生成LFM信号模型,设定其初始频率、扫频率、持续时间和采样率等参数;其次,利用自定义的frft函数对LFM信号进行分数阶傅里叶变换;接着,使用MATLAB的可视化工具(如plot或imagesc)展示原始信号的时域和频域表示,以及FRFT后的结果,以便直观对比;最后,通过计算均方误差、峰值信噪比等指标来评估FRFT的性能。深入理解FRFT的数学原理并结合MATLAB编程技巧,可以实现对LFM信号的有效分析和处理。这个代码示例不仅展示了理论知识在
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值