当前位置: 移动技术网 > IT编程>开发语言>C/C++ > matlab2c使用c++实现matlab信号操作函数awgn、normrnd、fft、sawtooth、sinc、signcdf、signpdf

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

2018年02月11日  | 移动技术网IT编程  | 我要评论

薄谷开来简历,中通速递单查询,青川县政府

本次带给大家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;
}

//复数序列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
      

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网