Hilbert变换C语言实现学习

通过离散傅里叶变换(DFT)实现希尔伯特变换。

Hilbert变换C语言实现学习。

Plan:五一前完成希尔伯特C语言编程,能与MATLAB 得出的结果相对应。

Hilbert变换原理

假设有一个离散时间信号s(n),s(n)的希尔伯特变换为:s^(n)
在这里插入图片描述
其中:在这里插入图片描述
在这里插入图片描-π<w<π述
-π<w<π

s(n)的解析信号为g(n)=s(n)+js^(n)

用DFT求离散信号s(n)的解析信号及其Hilbert变换

步骤如下:

  1. 对s(n)做DFT,的S(k),k=0,1,2,3…,N-1;

Win10+VS2017安装FFTW库

参考文章:

https://blog.csdn.net/alxe_made/article/details/84205377

第一步:下载FFTW预编译库,网址为:http://www.fftw.org/install/windows.html
本网页下载完成即可离开。
第二步:解压缩下载的预编译文件。
第三步:运行lib.exe。如下图:找到64位的vs工具。
在这里插入图片描述
点击打开,输入>lib.exe,回车运行,如下图。
在这里插入图片描述
第四步:切换到解压缩后的文件:fftw-3.3.5-dll64目录下,并执行以下命令,如图:

lib /machine:x64 /def:libfftw3-3.def
lib /machine:x64 /def:libfftw3l-3.def
lib /machine:x64 /def:libfftw3f-3.def

在这里插入图片描述
打开解压缩后的文件,发现刚才生成了三个.exp文件,三个.lib文件,如图:
在这里插入图片描述
第五步:将生成的文件复制到下图位置:
在这里插入图片描述

  1. 将我们E:\fftw-3.3.5-dll64下面的生成的库文件libfftw3-3.lib ,libfftw3f-3.lib ,libfftw3l-3.lib 拷贝到lib文件夹里面。
  2. 将E:\fftw-3.3.5-dll64盘下面fftw3.h放到include文件夹里面。
  3. 将E:\fftw-3.3.5-dll64下的libfftw3-3.dll、libfftw3f-3.dll、libfftw3l-3.dll复制到C:\Windows\SysWOW64
  4. 将E:\fftw-3.3.5-dll64下的libfftw3-3.dll、libfftw3f-3.dll、libfftw3l-3.dll也复制到C:\Windows\System32里面。

第六步:新建一个测试工程,输入以下代码:

#include "fftw3.h"  
#include <windows.h>
int main()
{
	fftw_complex *in, *out;
	fftw_plan p;
	int N = 8;
	int i;
	int j;
	in = (fftw_complex*)fftw_malloc(sizeof(fftw_complex) * N);
	out = (fftw_complex*)fftw_malloc(sizeof(fftw_complex) * N);
	for (i = 0; i < N; i++)
	{
		in[i][0] = 1.0;
		in[i][1] = 0.0;
		printf("%6.2f ", in[i][0]);
	}
	printf("\n");
	p = fftw_plan_dft_1d(N, in, out, FFTW_FORWARD, FFTW_ESTIMATE);
	fftw_execute(p); /* repeat as needed*/
	for (j = 0; j < N; j++)
	{
		printf("%6.2f ", out[j][0]);
	}
	printf("\n");
	fftw_destroy_plan(p);
	fftw_free(in);
	fftw_free(out);
	system("pause");//暂停
	return 0;
}


第七步:配置一下工程属性,在工程->属性->配置属性->链接器->输入->附加依赖项中,修改如下图所示:
在这里插入图片描述
在这里插入图片描述
运行后得到结果:
在这里插入图片描述
完成添加FFTW库。

未完待续……

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Hilbert变换是一种信号处理技术,用于将实数信号转换为具有实部和虚部的解析信号。它在许多领域,如通信、图像处理和模式识别中有广泛的应用。 在C语言中,可以使用离散Hilbert变换(DHT)的算法实现Hilbert变换。以下是一个简单的示例代码实现DHT: ```c #include <stdio.h> #include <math.h> // 计算离散Hilbert变换 void hilbertTransform(double* input, int n) { int i, j; double* output = malloc(n * sizeof(double)); for (i = 0; i < n; i++) { output[i] = 0; for (j = 0; j < n; j++) { double phase = ((double)(2 * i * j) / n) * M_PI; output[i] += input[j] * sin(phase); } } for (i = 0; i < n; i++) { input[i] = output[i]; } free(output); } int main() { // 输入信号 double input[] = {1, 2, 3, 4, 5}; int n = sizeof(input) / sizeof(double); // 打印输入信号 printf("输入信号:"); for (int i = 0; i < n; i++) { printf("%.2f ", input[i]); } printf("\n"); // 应用离散Hilbert变换 hilbertTransform(input, n); // 打印Hilbert变换后的信号 printf("Hilbert变换后的信号:"); for (int i = 0; i < n; i++) { printf("%.2f ", input[i]); } printf("\n"); return 0; } ``` 在上面的示例代码中,我们定义了一个`hilbertTransform`函数来计算离散Hilbert变换。它使用了一个for循环来计算每个输出样本的值。然后,我们在`main`函数中定义了一个输入信号并应用了Hilbert变换。最后,我们打印了变换后的输出信号。 请注意,以上示例只是Hilbert变换的一个简单实现,实际应用中可能需要考虑更多的细节和算法优化。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值