通常我们用到的信号都是实值信号,但是我们可以根据这个实信号构造出一个复信号,使得这个复信号只包含正频率部分,而且这个复信号的实部正好就是我们原来的实值信号。简单的推导可知,复信号的虚部是原信号的希尔伯特变换。这样构造出来的信号就叫做解析信号。因此,如何生成解析信号与如何对一个信号进行希尔伯特变换其实是等价的问题。获得解析信号后可以计算波形的包络、瞬时频率、相位等,是非常有用的。所以如何生成解析信号也是个有意义的课题。

对于有限长的序列,计算其频谱,然后将频谱的负频率部分设为0 是最直接的办法。但是实际操作时还是有些小的技巧的,否则你会发现总是得不到正确的结果。

下面举例来说明:

有如下数据

x = [ 1; 2; 2; 1; 1; 2; 2; 1];

FFT 后的结果是

    12.
0
- 2. - 2.i
0
0
0
- 2. + 2.i
0

按照最普通的想法

然后反变换回去,得到结果为:

1.25 - 0.25i
1.75 - 0.25i
1.75 + 0.25i
1.25 + 0.25i
1.25 - 0.25i
1.75 - 0.25i
1.75 + 0.25i
1.25 + 0.25i

可以看到实部并不相等,所以这样变换是不正确的。问题在于没有注意到边界点的处理。正确的公式如下:

按照这个公式,Z[m] 计算如下:

12
0
- 4. - 4.i
0
0
0
0
0

反变换后

1 - 0.5i
2 - 0.5i
2 + 0.5i
1 + 0.5i
1 - 0.5i
2 - 0.5i
2 + 0.5i
1 + 0.5i

可以看到这样变换的结果才正确。

由于解析信号没有负频率部分。所以相应的采样频率也可以降低一半而不至混叠。将计算解析信号与降采样两步合并到一起计算的算法如下:

还以上面的数据为例:

Z =
6.
0
- 2. - 2.i
0

反变换后的结果如下:

1- 0.5i
2. + 0.5i
1. - 0.5i
2. + 0.5i

确认结果正确。

刚才是降采样,如果要加密采样点可以用类似的方法。

对应的scilab代码如下:

x = [ 1; 2; 2; 1; 1; 2; 2; 1];
N =length(x);
M = 4;
X =fft(x);
Z= M * ifft([X(1); 2*X(2:N/2);X(N/2+1);zeros(M*N-N/2-1,1)]);

大家可以自行验证。

本文中没有设计到具体公式的推导,希望获得详细信息的人可以阅读 Lawrence 写的文章 "Computing the Discrete-Time Analytic signal via FFT"。

利用FFT 计算生成离散解析信号的更多相关文章

  1. 利用Xstream注解生成和解析xml

    实体类: @XStreamAlias("person") public class PersonBean {     @XStreamAlias("firstName&q ...

  2. java 利用Xstream注解生成和解析xml

    https://www.oschina.net/code/snippet_116183_14202#23325

  3. 解析利用wsdl.exe生成webservice代理类的详解

    利用wsdl.exe生成webservice代理类:根据提供的wsdl生成webservice代理类1.开始->程序->Visual Studio 2005 命令提示2.输入如下红色标记部 ...

  4. Android 利用Gson生成或解析json

    目前手机端和服务端数据交流格式一般是json,而谷歌提供了Gson来解析json.下载Gson:https://code.google.com/p/google-gson/ 下载的放在lib并导入,若 ...

  5. Amdroid示例:利用Gson生成或解析json

    转自:http://www.cnblogs.com/liqw/p/4266209.html 目前手机端和服务端数据交流格式一般是json,而谷歌提供了Gson来解析json.下载Gson:https: ...

  6. DELPHI XE10,JSON 生成和解析,再利用INDYHTTP控件POST

    Delphi XE10,Json 生成和解析,再利用indyhttp控件Post 年09月20日 :: 阅读数: --不多说,直接上代码 procedure TFrmMain.Brand; var J ...

  7. Python分析离散心率信号(下)

    Python分析离散心率信号(下) 如何使用动态阈值,信号过滤和离群值检测来改善峰值检测. 一些理论和背景 到目前为止,一直在研究如何分析心率信号并从中提取最广泛使用的时域和频域度量.但是,使用的信号 ...

  8. [笔记]ACM笔记 - 利用FFT求卷积(求多项式乘法)

    卷积 给定向量:, 向量和: 数量积(内积.点积): 卷积:,其中 例如: 卷积的最典型的应用就是多项式乘法(多项式乘法就是求卷积).以下就用多项式乘法来描述.举例卷积与DFT. 关于多项式 对于多项 ...

  9. Python分析离散心率信号(中)

    Python分析离散心率信号(中) 一些理论和背景 心率信号不仅包含有关心脏的信息,还包含有关呼吸,短期血压调节,体温调节和荷尔蒙血压调节(长期)的信息.也(尽管不总是始终如一)与精神努力相关联,这并 ...

随机推荐

  1. hibernate 事务的隔离级别 5.1

    脏读不可重复读幻读可序列化(符合事务的四个特性的正常情况 ) 解释: 脏读:事务A对数据1做了更新,但是还没有来得及提交 此时事务B对数据1进行了查询获得了事务A更新后的数据, 但是事务A因为一些原因 ...

  2. IT第三天 - 数据类型、转换、Scanner使用

    IT第三天 上午 变量类型 1.6种数值类型:byte.short.int.long.float.double:其中byte是8个字节,short是16字节,int是32字节.long是64字节:日常 ...

  3. C#实现多人语音聊天

    在上一篇文章 实现一个简单的语音聊天室(多人语音聊天系统)中,我用C#实现了一个简单的语音聊天室,并给出了源代码下载.尽管有源代码,可是非常多朋友反映,理解起来还是有些模糊.不够清楚.如今想来,是由于 ...

  4. Android开发之TextView排版问题

    下面直接是关于解决该问题的代码(根据别人的代码进行了修正以及测试,保证可以修改字体尺寸.颜色.根据padding调整,如果需要支持其他的格式可以将对应的属性添加至Paint类型的对象中):   1 p ...

  5. android取得所在位置的经纬度

    android提供了LocationManager来取得位置,用LocationListener来监听位置的变化 先做一些初始化工作: /** latitude and longitude of cu ...

  6. iOS 文件操作:沙盒(SandBox)、文件操作(FileManager)、程序包(NSBundle)

    版权声明:本文为博主原创文章,转载请声明出处:http://blog.csdn.net/jinnchang 1.沙盒机制介绍 iOS 中的沙盒机制(SandBox)是一种安全体系.每个 iOS 应用程 ...

  7. C#_会员管理系统:开发五(用户注册)

    创建一个新的用户注册窗体(VIPRegistration.cs): 用户注册窗体(VIPRegistration.cs)详细代码如下: using System; using System.Colle ...

  8. FFT算法

    FFT算法的完整DSP实现 傅里叶变换或者FFT的理论参考: [1] http://www.dspguide.com/ch12/2.htm The Scientist and Engineer's G ...

  9. CSS 实现图片灰度效果 兼容各种浏览器

    CSS 实现图片灰度效果 兼容各种浏览器如360浏览器 CSS实现图片灰度效果就是通过CSS样式让彩色图片呈现为灰色,相当于把一张图像的颜色模式调整为灰度,CSS可以通过以下几种方法来实现灰度效果. ...

  10. Nutch 是一个开源Java 实现的搜索引擎

    Nutch 是一个开源Java 实现的搜索引擎.它提供了我们运行自己的搜索引擎所需的全部工具.包括全文搜索和Web爬虫. Nutch的创始人是Doug Cutting,他同时也是Lucene.Hado ...