MATLAB库函数hilbert(希尔伯特变换)的C语言实现(FFT采用FFTW库)

目录

  • 希尔伯特变换原理公式
  • MATLAB官方帮助文档中希尔伯特变换算法
  • 常量和结构体定义
  • C语言实现(FFTW库的float版,double版类似)

希尔伯特变换原理公式

在这里插入图片描述
在这里插入图片描述

MATLAB官方帮助文档中希尔伯特变换算法

hilbert uses a four-step algorithm:
Calculate the FFT of the input sequence, storing the result in a vector x.
Create a vector h whose elements h(i) have the values:
1 for i = 1, (n/2)+1
2 for i = 2, 3, ... , (n/2)
0 for i = (n/2)+2, ... , n
Calculate the element-wise product of x and h.
Calculate the inverse FFT of the sequence obtained in step 3 and returns the first n elements of the result.

常量和结构体定义

// ConstParam.h
#ifndef CONSTPARAM
#define CONSTPARAM
#include "fftw3.h"const float PI = 3.1415926535897932;
const float TWO_PI = 6.2831853071795864;const int REAL = 0;
const int IMAG = 1;const __int64 BufSize = 1048576;float CosVal[5] = { 1,0.309016994374947,-0.809016994374947 ,-0.809016994374948,0.309016994374947 };
float SinVal[5] = { 0,0.951056516295154, 0.587785252292473, -0.587785252292473, -0.951056516295154 };const float ACC = 40.0;
const float BIGNO = 1.0e10;
const float BIGNI = 1.0e-10;#define max(a,b) (a>b?a:b)typedef struct _Resampler_
{int _upRate;int _downRate;float *_transposedCoefs;float *_state;float *_stateEnd;int _paddedCoefCount;  // ceil(len(coefs)/upRate)*upRateint _coefsPerPhase;    // _paddedCoefCount / upRate__int64 _t; // "time" (modulo upRate)__int64 _xOffset;
}sResampler;
#endif

C语言实现(FFTW库的float版,double版类似)

// hilbert.h
#include <memory.h>
#include "ConstParam.h"
/*
in - 输入数据指针
out - 希尔伯特变换结果数组指针
N - 数据长度
*/
void hilbert(float* in, fftwf_complex* out,int N)
{// copy the data into the complex arrayfor (int i = 0; i < N; ++i){out[i][REAL] = in[i];out[i][IMAG] = 0;}//create a DFT plan and execute itfftwf_plan plan = fftwf_plan_dft_r2c_1d(N, in, out, FFTW_ESTIMATE);fftwf_execute(plan);//destroy the plan to prevent a memory leakfftwf_destroy_plan(plan);int hN = N >> 1;			// half of the length (N /2)int numRem = hN;		// the number of remaining elements// multiply the appropriate values by 2// (those that should be multiplied by 1 are left intact because they wouldn't change)for (int i = 1; i < hN; ++i) // 1,2,...,N/2 - 1 的项乘以2{out[i][REAL] *= 2;out[i][IMAG] *= 2;}// if the length is even, the number of remaining elements decreases by 1if (N % 2 == 0)numRem--;// if it's odd and greater than 1, the middle value must be multiplied by 2else if (N > 1)  // 奇数非空{out[hN][REAL] *= 2; out[hN][IMAG] *= 2;}// set the remaining values to 0// (multiplying by 0 gives 0, so we don't care about the multiplicands)memset(&out[hN + 1][REAL], 0, numRem * sizeof(fftwf_complex));// create an IDFT plan and execute itplan = fftwf_plan_dft_1d(N, out, out, FFTW_BACKWARD, FFTW_ESTIMATE); fftwf_execute(plan);// do some cleaningfftwf_destroy_plan(plan); fftwf_cleanup();// scale the IDFT output for (int i = 0; i < N; ++i){out[i][REAL] /= N;out[i][IMAG] /= N;}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/347344.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

netbeans7.4_NetBeans 7.4 Beta提示警告无效的异常处理

netbeans7.4有许多例子说明Java异常处理可能比首次出现时要困难得多&#xff0c;Josh Bloch专门将一整章的《 Effective Java》 &#xff08;两个版本&#xff09;专门用于异常处理。 Java中的检查异常模型 仍然 “ 有争议” 。 我很高兴看到我最近下载的NetBeans 7.4 beta有一…

在厚度仅十几微米的电池隔膜找缺陷?人工智能说,能行(人工智能应用案例)

原文链接&#xff1a;https://www.paddlepaddle.org.cn/support/news?actiondetail&id2104 “我们的质检要做的是在厚度仅十几微米的电池隔膜上找出所有微小缺陷&#xff0c;如果没有检测出来&#xff0c;就很可能使新能源汽车的电池在使用过程中出现问题&#xff0c;甚至…

MATLAB库函数unwrap(相位解卷绕)的C语言实现

什么是相位解卷绕 Q = unwrap(P) Q = unwrap(P) corrects the radian phase angles in a vector P by adding multiples of 2π when absolute jumps between consecutive elements of P are greater than or equal to the default jump tolerance of π radians. If P is a …

准确率超90%、1秒发出报警,人工智能助国网山东实现无人巡检(人工智能应用案例)

原文链接&#xff1a;https://mp.weixin.qq.com/s/Jh2YLY-4um79ucdHIs5NTg 众所周知&#xff0c;深度学习框架是人工智能的基础技术“底座”&#xff0c;在各大传统产业上也有着巨大的潜力尚待挖掘。5月20日&#xff0c;由深度学习技术及应用国家工程实验室与百度联合主办的“…

混合多云每个人都应避免的3个陷阱(第2部分)

如果您已经完全控制了内部数据中心&#xff0c;但又不能停止利用和支付过多的资源&#xff0c;那么如何期望防止这些成本转嫁到您的云策略中呢&#xff1f; 每天都在肆意宣传云&#xff0c;但每个人都应避免三个陷阱。 从云&#xff0c;混合云到混合多云&#xff0c;您被告知这…

MATLAB库函数upfirdn(分数倍采样率变换)的C语言实现【姊妹篇1基于std::vector】

upfirdn原理 yout = upfirdn(xin,h,p,q) upfirdn的功能在MATLAB官方帮助文档中说得很清楚 通过插零实现 p p p倍上采样对上采样之后的信号用给定的 h h h(通常为低通滤波器)进行滤波对滤波结果进行

基于PaddlePaddle实现高尔夫球场的遥感检测(人工智能应用案例)

原文链接&#xff1a;https://www.paddlepaddle.org.cn/support/news?actiondetail&id2103 1 . 背景及意义 随着高尔夫球运动在我国的兴起&#xff0c;关于高尔夫球场大量占用土地资源、污染环境、耗水量大且公益性差的争议越来越多。国家从2004年开始制定一系列相关政策…

在Jersey测试中模拟SecurityContext

泽西极有可能编写与泽西一起编写的REST-API集成测试。 只需扩展类JerseyTest并继续就可以了。 我遇到一个问题&#xff0c;我不得不模拟SecurityContext &#xff0c;以便SecurityContext包含一个特殊的UserPrincipal 。 挑战在于Jersey在测试中将SecurityContext包装在自己的…

第一类修正贝塞尔函数的C语言实现

第一类修正贝塞尔函数公式 Iν(z)(z2)ν∑(k0)∞(z24)kk!Γ(νk1)I_{\nu}(z)\left(\frac{z}{2}\right)^{\nu} \sum_{(k0)}^{\infty} \frac{\left(\frac{z^{2}}{4}\right)^{k}}{k ! \Gamma(\nuk1)}Iν​(z)(2z​)ν(k0)∑∞​k!Γ(νk1)(4z2​)k​ 其中&#xff0c;Γ(a)\Gamma…

MATLAB库函数firls(最小二乘线性相位FIR滤波器设计)的C语言实现

firls函数功能 FILS设计了一种线性相位FIR滤波器,它可以最小化理想分段线性函数与滤波器在一组期望频带上的幅值响应之间的加权积分平方误差。 b = firls(n,f,a) b = firls(n,f,a,w) b = firls(n,f,a,ftype) b = firls(n,f,a,w,ftype)f是在0和1之间的范围内指定的频率点对的…

数电实验一-初识Multisim和Basys3

特别说明&#xff1a;该系列内容均是本人实验记录&#xff0c;无盗取侵权之嫌&#xff0c;仅供参考&#xff0c;请多动手实践&#xff01; 一、实验目的 详见报告 二、实验仪器设备 详见报告 三、实验设计过程 使用Multisim为Basys3板卡创建一个PLD设计并进行验证。 1.创建P…

自动化学科前沿讲座作业 基于深度学习的工厂人员监测系统设计

1 背景及应用场景 在工业复杂生产环境下&#xff0c;作业人员的安全问题至关重要。大多数工业企业采用人眼观察视频的方式对作业人员位置进行判断&#xff0c;这种方式长时间会使管理者出现疲劳问题&#xff0c;效率非常低下&#xff0c;遇到安全问题也不能进行及时的处理。采用…

MATLAB库函数resample(重采样函数)的C语言实现【姊妹篇1基于std::vector】

resample的原理 MATLAB中resample函数最简单的参数如下: y = resample(x,p,q) 以p/q乘以原始采样速率对输入序列x重新采样。resample在x上应用抗锯齿FIR低通滤波器,补偿滤波器带来的延迟。 根据以下2篇文章 MATLAB库函数upfirdn(分数倍采样率变换)的C语言实现(采用了STL::v…

多重继承java_Java中的多重继承与组合vs继承

多重继承java有时我写了几篇有关Java 继承 &#xff0c; 接口和组成的文章。 在这篇文章中&#xff0c;我们将研究多重继承&#xff0c;然后了解组成优于继承的好处。 Java中的多重继承 多重继承是创建具有多个超类的单个类的能力。 与其他一些流行的面向对象的编程语言&#…

数电实验二-点亮一个数码管(Multisim和Basys3 )

特别说明&#xff1a;该系列内容均是本人实验记录&#xff0c;无盗取侵权之嫌&#xff0c;仅供参考&#xff0c;请多动手实践。 一、实验目的 详见报告 二、实验环境 详见报告 三、实验内容 &#xff08;1&#xff09;基本要求&#xff1a;以Basys3四位拨码开关SW3~SW0为输入…

模拟调频信号FM解调的matlab和C语言实现【姊妹篇1基于std::vector】

本文所需的FM已调信号、原始音频、包络检波法解调后的音频、差分相位法解调后的音频,可通过以下链接进行下载。其中,FM已调信号文件较大共有两百多兆,故截取其部分上传,若有需要完整信号的请留言! FM调制解调音频文件.rar 已调信号:采样率为 F s = 5 m H z Fs=5mHz Fs=

倍福(Beckhoff)嵌入式控制器PLC

前些天发现了十分不错的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;没有广告&#xff0c;分享给大家&#xff0c;大家可以自行看看。&#xff08;点击跳转人工智能学习资料&#xff09; 摘要&#xff1a;与家喻户晓的西门子相比&#xff0c;倍福&am…

fftw-3.3.8库在linux下的的编译和配置

关注公号【逆向通信猿】更精彩!!! 运行环境 Ubuntu 14.04版本以上,64位系统 FFTW库的下载 首先在官网上下载fftw-3.3.8.tar.gz压缩包,解压。本人下载好的压缩包地址:https://download.csdn.net/download/wlwdecs_dn/12904577 FFTW库的生成 首先,将压缩包进行解压,…

tms tck_两个用于Eclipse的TCK –开源到底有什么?

tms tck早在5月&#xff0c;Oracle就向Eclipse Foundation 授予了兼容性测试奖学金 。 在过去的几天里&#xff0c;这引起了媒体的关注&#xff0c;我只是想确保我对整个过程和详细动作有所了解。 看起来像是一见钟情的简单诚实的礼物实际上具有更多的方面。 但是让我们从头开始…

倍福嵌入式控制器PLC各型号简介

CX8000 性能强大的 32 位控制器&#xff0c;集成现场总线和 I/O 接口 CX8000 系列产品是一款可编程控制器&#xff0c;搭载 32 位 ARM 处理器&#xff0c;可用于处理 PLC 程序或用作为上位现场总线系统的从站设备。与 EK 系列总线耦合器&#xff08;EtherCAT 耦合器&#xff0…