欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

matlab2c使用c++实现matlab信号操作函数awgn、normrnd、fft、sawtooth、sinc、signcdf、signpdf

程序员文章站 2022-08-11 10:54:03
本次带给大家c++实现matlab函数中关于“信号操作”的相关函数,包括 awgn、normrnd、fft、sawtooth、sinc、signcdf、s...

本次带给大家c++实现matlab函数中关于“信号操作”的相关函数,包括
awgn、normrnd、fft、sawtooth、sinc、signcdf、signpdf等matlab函数。

在你的项目中引用下载的matlab2c.h文件。

在你的cpp文件中声明需要调用的函数。

#include "Matlab2c.h"           //添加文件引用
using namespace Matlab2c;       //添加空间引用

//为信号添加高斯白噪声   信噪比单位为dB
Matrix awgn(Matrix& sign,double SNR);
//生成正太分布矩阵
Matrix normrnd(int rowsnum ,int columnsnum ,double aver ,double sigma);
//复数序列fft    提示:实序列可以先转化为复数结构体再fft
CMatrix fft(CMatrix& a);
//产生锯齿波或者三角波,幅度为正负1   //a是行向量,产生周期为2pi,width为上升段比例
Matrix sawtooth(Matrix& a,double width);
//生成sinc信号   输入:sinc信号时域取值点a   输出:sinc信号在取值点上的值
Matrix sinc(Matrix& a);
//获取信号数据data在区间x点上的累计概率密度 
Matrix signcdf(Matrix& data ,Matrix& x);
//根据信号信息获取数据的概率密度函数   data 和x是向量
//提示:概率密度计算可能和公式计算不一样.这里为区间点上的积分值
Matrix signpdf(Matrix& data ,Matrix& x);

在你的cpp文件中编写矩阵生成函数的具体实现。

#include "Matlab2c.h"
using namespace Matlab2c;

//为信号添加高斯白噪声
//输入:实信号,信噪比
// 输出:输出添加列信噪比的信号
// 提示:信噪比单位为dB

Matrix awgn(Matrix& sign,double SNR)
{
    int i;
    double sigPower=0; 
    double noisePower=0;
    Matrix p(sign.row,sign.column);
    Matrix noise;
    srand((unsigned)time(NULL));
    for (i=0;i

//生成正太分布矩阵

Matrix normrnd(int row,int column,double aver ,double sigma)
{
    double x,dScope,y,fengzhi;
    int i,j;
    Matrix p(row,column);
    srand((unsigned)time(0));
    for (i=0;i y);

            p(i,j)=x;
        }
    }
    return p;
};i++)>

//复数序列fft
//输入:复数序列a
// 输出:序列a的fft
// 提示:实序列可以先转化为复数结构体再fft

CMatrix fft(CMatrix& a)
{
    int i,k;
    CMatrix p;
    int len =a.row*a.column;
    double x1,y1;
    p.row=a.row;
    p.column=a.column;
    p.data = new Complex[p.row*p.column];
    for(k=0;k

//产生锯齿波或者三角波,幅度为正负1 //输入:锯齿波信号时域取值点a,上升段比例width // 输出:锯齿波信号在取值点上的值 // 提示:幅度为正负1,周期为2pi,width为上升段比例

Matrix sawtooth(Matrix& a,double width)//a是行向量,产生周期为2pi,width为上升段比例
{
    int i,j;
    Matrix p(a.row,a.column);
    int n;
    double data;
    for (i=0;i0)
                p(i,j) = 1.0/(PI*width)*data-1;
            else if (data>(2*PI*width) && data<=(2*PI))
                p(i,j) = -1.0/(PI*(1-width))*data+(1+width)/(1-width);
        }
        return p;
}

//生成sinc信号
//输入:sinc信号时域取值点a
// 输出:sinc信号在取值点上的值

Matrix sinc(Matrix& a)
{
    int i,j;
    Matrix p(a.row,a.column);
    for (i=0;i

//获取信号数据data在区间x点上的累计概率密度 //输入:信号数据,计算累计概率的区间点 // 输出:信号在区间点上的累计概率值 // 提示:调用较多内部自定义函数

Matrix signcdf(Matrix& data ,Matrix& x)
{
    int i;
    Matrix p,temp1,temp2;
    temp1 = Matlab2c::x_vector(-INT_MAX,x);  //添加一个负无穷大
    temp2 = Matlab2c::histc(data,temp1);
    temp2.row--;  //去掉最后一个数据,因为最后一个一定为1
    for (i=0;i

//根据信号信息获取数据的概率密度函数 //输入:信号数据data 计算概率的区间点 // 输出:信号数据在区间点上的概率密度 // 提示:概率密度计算可能和公式计算不一样.这里为区间点上的积分值

Matrix signpdf(Matrix& data ,Matrix& x) // data 和x是向量
{
    int i;
    Matrix p;
    p = Matlab2c::histc(data,x);
    p.row--;  //去掉最后一个数据,因为区间数比数据点数少一个
    for (i=0;i;i++)>
;i++)>
;i++)>
;k++)>
*sign.column;i++)>