4

首先,请原谅我在这个领域的无知,我是一名程序员,但一直陷入超出我专业知识(数学和信号处理)的境地。

我有一个需要移植到 C++ 程序的 Matlab 脚本(无需将 matlab 代码编译成 DLL)。它使用hilbert()带有一个参数的函数。我试图找到一种在 C++ 中实现相同功能的方法(即有一个函数也只接受一个参数,并返回相同的值)。

我已经阅读了使用 FFT 和 IFFT 构建它的方法,但似乎无法获得像 Matlab 版本那样简单的东西。主要的是我需要它在 128*2000 矩阵上工作,而我在搜索中发现的任何内容都没有告诉我如何做到这一点。

我可以返回一个复杂的值,或者只是绝对值。集成到代码中越简单越好。

谢谢你。

4

4 回答 4

9

MatLab 函数 hilbert() 实际上并不直接计算希尔伯特变换,而是计算分析信号,这是大多数情况下需要的东西。它通过采用 FFT、删除负频率(将阵列的上半部分设置为零)并应用逆 FFT 来实现。如果您有一个不错的 FFT 实现,那么在 C/C++(三行代码)中将是直截了当的。

于 2012-08-14T19:53:00.067 回答
2

看起来很不错,只要你能处理 GPL 许可证。更大的数值计算资源的一部分。

于 2012-08-13T21:57:54.463 回答
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))
于 2013-12-10T06:37:12.767 回答
0

这不是您问题的真正答案,但也许是一种让您睡得更好的方法。我相信在矩阵上基本上是 ffts 的特殊情况下,您将无法比 Matlab 快得多。这就是 Matlab 擅长的地方!

Matlab FFT 是使用 FFTW 计算的,FFTW 是用 C 编写的事实上最快的 FFT 算法,似乎也由 Matlab 并行化。最重要的是,引用http://www.mathworks.com/help/matlab/ref/fftw.html

对于 2 次方的 FFT 维度,介于 214 和 222 之间,MATLAB 软件使用其内部数据库中的特殊预加载信息来优化 FFT 计算。

因此,如果您的代码稍慢一点,请不要感到难过...

于 2016-07-04T20:59:20.127 回答