使用Armadillo库实现hilbert(希尔伯特变换)
注1:由于项目需要将matlab转成C++,但直接生成问题很多,故采用Armadillo矩阵库实现转码,但是没有找到MATLAB中的希尔伯特变换,所以写了一个,下面函数算出的是解析信号,跟matlab中的一模一样,实测有用。
注2:ubuntu下用gcc编译 g++ xxx.cpp -o xxx -larmadillo -lm
这里编译需要使用-larmadillo
#include <iostream>
#include <armadillo>//armadillo库
#include <math.h>
#include <stdio.h>
#include <unistd.h>
using namespace std;
using namespace arma;
cx_mat hilbert(mat x) //1x100
{
int n = x.n_cols;
cx_mat H(1,n);
cx_mat Y1;
cx_mat Y2(1,n);
cx_mat Y_temp;
Y1 = fft(x,n);//1X100
H.col(0)=1;
H.col(n/2)=1;
for(int i=1;i<n/2;i++)
{
H.col(i) = 2;
}
for(int j=n/2+1;j<n;j++)
{
H.col(j) = 0;
}
Y2 = Y1%H;//矩阵点乘
Y_temp = ifft(Y2,n);//傅里叶反变换
return Y_temp;
}
int main()
{
mat R0;//我们的RO有值,此处没有给初值
cx_mat R1;//复数矩阵
R1=hilbert(R0);
return 0;
}