首先,请原谅我在这个领域的无知,我是一名贸易程序员,但我的专业知识(数学和信号处理方面)已经陷入困境。
我有一个Matlab脚本,我需要移植到C ++程序(不将matlab代码编译成DLL)。它使用带有一个参数的hilbert()
函数。我正在尝试找到一种在C ++中实现相同功能的方法(即,只有一个参数,并且返回相同的值)。
我已经阅读了使用FFT和IFFT构建它的方法,但似乎没有像Matlab版本那样简单。最重要的是我需要它在128 * 2000矩阵上工作,我在搜索中发现的任何内容都没有告诉我如何做到这一点。
我可以使用返回的复数值,或者只是绝对值。集成到代码中越简单越好。
谢谢。
答案 0 :(得分:7)
MatLab函数hilbert()实际上并不直接计算Hilbert变换,而是计算分析信号,这是大多数情况下需要的。 它通过取fft删除负频率(设置arry零的上半部分)并应用反fft来实现。如果你有一个像样的fft实现,它将在C / C ++(三行代码)中直截了当。
答案 1 :(得分:2)
This看起来很不错,只要你能处理GPL许可证。 much larger numerical computing resource的一部分。
答案 2 :(得分:0)
下面的简单代码。 (注意:这是一个更大项目的一部分)。 L的值取决于您对订单的确定,N.N = 2L-1。将N舍入为奇数。下面的xbar基于您定义为所设计系统输入的信号。这是在MATLAB中实现的。
L = 40;
n = -L:L; % index n from [-40,-39,....,-1,0,1,...,39,40];
h = (1 - (-1).^n)./(pi*n); %impulse response of Hilbert Transform
h(41) = 0; %Corresponds to the 0/0 term (for 41st term, 0, in n vector above)
xhat = conv(h,xbar); %resultant from Hilbert Transform H(w);
plot(abs(xhat))
答案 3 :(得分:0)
不是你问题的真实答案,但也许是一种让你睡得更好的方法。我相信,在矩阵基本上是ffts的特殊情况下,你不可能比Matlab快得多。这就是Matlab擅长的地方!
Matlab FFT是使用FFTW计算的,这是用C编写的事实上最快的FFT算法,它似乎也是由Matlab并行化的。最重要的是,引用http://www.mathworks.com/help/matlab/ref/fftw.html:
对于功率为2,在214和222之间的FFT维,MATLAB 软件在其内部数据库中使用特殊的预加载信息 优化FFT计算。
如果您的代码稍慢,请不要感到难过......