2019-07-16 22:20:52 weixin_41213648 阅读数 201
  • C++语音识别开篇

    本篇mark老师将教大家使用第三方库的调用来简单的实现语音识别。随着机器学习和人工智能的热闹,国内语音行业也可谓是百花齐放。 语音识别一个伟大的时代已在我们身边悄悄走来。

    6112 人正在学习 去看看 杨波

概述

虽然现在的语音识别中,DL已经应用的非常广泛了,但是语音识别终究还是有一些领域知识的,将之归类为DL或者ML,似乎都不妥当。特形成本系列文章,用以描述automatic speech recognition的领域知识和传统方法。

说起来还是要感谢DL,不然按照传统的行业划分,几乎不会有人同时研究CV和ASR。DL的出现,实际上大大降低了算法的领域迁移成本,领域知识的重要性相对下降了。

历史

早在电子计算机出现之前,人们就有了让机器识别语音的梦想。1920年生产的“Radio Rex”玩具狗可能是世界上最早的语音识别器,当有人喊“Rex”的时候,这只狗能够从底座上弹出来。

但实际上它所用到的技术并不是真正的语音识别,而是通过一个弹簧,这个弹簧在接收到500赫兹的声音时会自动释放,而500赫兹恰好是人们喊出“Rex”中元音的第一个共振峰。

学校

SR领域最牛的高校主要是美国的CMU、Johns Hopkins University、英国的Cambridge University和日本的东京大学。

书籍

《Speech and Language Processing: An introduction to natural language processing, computational linguistics, and speech recognition》,Daniel Jurafsky & James H. Martin著。

Daniel Jurafsky,1962年生,UCB本科(1983)+博士(1992)。斯坦福大学教授。 
个人主页: 
https://web.stanford.edu/~jurafsky/

James H. Martin,哥伦比亚大学本科+UCB博士。University of Colorado Boulder教授。 
个人主页: 
http://www.cs.colorado.edu/~martin/

这本书比较老了(1999年),但毕竟是本1000页左右的书,传统方法该说的基本都说了。主要问题在于NLP和语义学的内容较多,相对来说ASR的内容就少了些。

这本书在2008年出了第2版(改动较小),如今第3版也在酝酿中,草稿可在如下网页获得:

https://web.stanford.edu/~jurafsky/slp3/

新版大幅增加了深度学习的内容。

《Spoken Language Processing-A Guide to Theory, Algorithm and System Development》,黄学东等著。

这本书基本上是ASR传统方法的大全了,无论理论还是工程实践都有相当大的篇幅,但也有些老了(2001年)。

《解析深度学习:语音识别实践》,俞栋、邓力著。

这本书算是中文写的比较好的教程了,而且DL的篇幅很大,内容非常新。(2016年)

教程

http://tts.speech.cs.cmu.edu/courses/11492/schedule.html

Speech Processing。CMU的这个教程主要包含ASR(Automatic Speech Recognition)、TTS(Text To Speech)和SDS(Spoken Dialog Systems)等三方面的内容。

Alan W Black,苏格兰计算机科学家。Coventry University本科(1984)+University of Edinburgh硕博(1984,1993)。CMU教授。语音处理专家。 
个人主页: 
http://www.cs.cmu.edu/~awb/ 
他的主页上有好多Speech、NLP方面的教程。他本人长得太像Java之父James Gosling了。

http://web.stanford.edu/class/cs224s/index.html

CS224S / LINGUIST285 - Spoken Language Processing。Stanford的教程相对比较新,DL涉及的比较多。

http://www.inf.ed.ac.uk/teaching/courses/asr/index.html

Automatic Speech Recognition。这个课程至少从2012年就开始了,每年都有更新。

http://speech.ee.ntu.edu.tw/DSP2018Spring/

国立台湾大学李琳山教授的课程。

李琳山,国立台湾大学本科(1974)+Stanford博士(1977)。国立台湾大学教授。

http://www.cs.cmu.edu/afs/cs/user/bhiksha/WWW/courses/11-756.asr/spring2014/

Theory and practice of speech recognition systems。CMU的Bhiksha Raj教授的课程,只有ASR的内容。

顺便说一句,Bhiksha Raj的主页上还有好多其他课程。

https://cs.nyu.edu/~eugenew/asr13/

这是MIT博士Eugene Weinstein在NYU当助教的时候(2013年)开的课程。

http://berlin.csie.ntnu.edu.tw/Courses/Speech%20Processing/Speech%20Processing_Main_2016S.htm

Speech Processing。国立台湾师范大学的陈柏琳教授的课程。陈教授教学多年,主页上还有好多其他课程。

https://www.isip.piconepress.com/courses/msstate/ece_8463/lectures/current/index.html

Mississippi State University:ECE 8463: fundamentals of speech recognition

https://www.isip.piconepress.com/courses/msstate/ece_7000_speech/index.html

ECE 8000: special topics in speech recognition

https://www.isip.piconepress.com/courses/msstate/ece_8990_info/index.html

ECE 8990: Information Theory。这门课偏重数学理论,包括Entropy、Markov Processes、Kolmogorov Complexity等内容,适合用于补数学基础。

http://courses.cs.tamu.edu/rgutier/csce630_f14/

CSCE 630: Speech Processing

http://courses.cs.tamu.edu/rgutier/cpsc689_s07/

CPSC 689-604: Special topics in Speech and Face Recognition

https://mp.weixin.qq.com/s/oaOkla9gnUKr2C6PSjE2BA

语音识别中的End-to-End模型教程(附178页PDF全文下载)

https://mp.weixin.qq.com/s/i7JaDoU2L7uRYsw8FTR3jA

语音研究进阶指南

blog

http://www.cnblogs.com/welen/

https://blog.csdn.net/weiqiwu1986

上面两个都是welen的blog,而且内容貌似还不重复。。。

http://blog.csdn.net/xmdxcsj

一个语音识别的blog

https://blog.csdn.net/shichaog

一个语音识别+Kaldi的blog

https://blog.csdn.net/quhediegooo/

一个语音识别的blog

https://blog.csdn.net/dearwind153/article/category/6506891

这哥们的blog很杂,这是语音相关的专栏

http://www.cnblogs.com/JarvanWang/

一个语音识别+Kaldi的blog

https://www.zhihu.com/question/65516424

语音识别kaldi该如何学习?

http://vsooda.github.io/archive/

一个语音识别+DL的blog

https://zhuanlan.zhihu.com/codingmath

一个语音识别的blog

https://blog.csdn.net/jojozhangju

一个Kaldi+声源定位的blog

项目

https://en.wikipedia.org/wiki/List_of_speech_recognition_software

List of speech recognition software

https://mp.weixin.qq.com/s/LsVhMaHrh8JgfpDra6KSPw

横向对比5大开源语音识别工具包

https://github.com/lingochamp/kaldi-ctc

英语流利说开源的kaldi-ctc

https://zhuanlan.zhihu.com/p/23177950

kaldi-ctc: CTC End-to-End ASR

https://mp.weixin.qq.com/s/VkKFQ0fOOHJw0p7Z4EDugQ

绝佳的ASR学习方案:这是一套开源的中文语音识别系统

HTK

Hidden Markov Model Toolkit是Cambridge University开发的语音识别的工具包。它是GMM-HMM时代最为流行的语音识别工具,但近来流行度不如Kaldi。

官网:

http://htk.eng.cam.ac.uk/

HTK Book不仅是使用手册,也是一本介绍原理的书。

http://speech.ee.ntu.edu.tw/homework/DSP_HW2-1/htkbook.pdf

CMU Sphinx

CMU Sphinx是李开复的博士课题项目,后来成为了CMU的长期项目。洪小文、黄学东也先后参与过。该项目比较早的将HMM应用于语音识别,这在当时算是一个重大创新。

李开复,1961年生,Columbia University本科(1983)+CMU博士(1988)。先后供职于Apple、SGI、Microsoft、Google。现为创新工场董事长。

洪小文,1963年生,台湾大学本科+CMU博士。先后供职于Apple、Microsoft,现为微软亚洲研究院院长。

黄学东,1962年生,湖南大学本科(1982)+清华大学硕士(1984)+University of Edinburgh博士(1989)。现为微软首席语音科学家。

Raj Reddy,1937年生,印度裔美国计算机科学家。印度University of Madras本科(1958)+澳大利亚University of New South Wales硕士(1960)+Stanford University博士。CMU教授,首位亚裔图灵奖得主(1994)。 
他还是印度Rajiv Gandhi University of Knowledge Technologies创始人和International Institute of Information Technology, Hyderabad主席。 
他是李开复、洪小文的博士导师,黄学东的博士后导师。

官网:

https://cmusphinx.github.io/

注意:还有一个类似Elasticsearch的文本搜索引擎也叫Sphinx。它的官网是:

http://sphinxsearch.com/

SPTK

The Speech Signal Processing Toolkit是日本的几个科学家开发的语音识别工具库。

官网:

http://sp-tk.sourceforge.net/

Julius

Julius是另一个日本人开发的语音识别工具库。

官网:

http://julius.osdn.jp/en_index.php

HTS

HMM/DNN-based Speech Synthesis System也是日本人开发的工具库,主要用于语音合成。

官网:

http://hts.sp.nitech.ac.jp

Praat

Praat是一款跨平台的多功能语音学专业软件,由University of Amsterdam的Paul Boersma和David Weenink开发。主要用于对数字化的语音信号进行分析、标注、处理及合成等实验,同时生成各种语图和文字报表。

官网:

http://www.fon.hum.uva.nl/praat/

公司

http://www.aispeech.com/

思必驰

http://www.soundai.com/

声智科技。偏重于语音信号处理。

https://zhuanlan.zhihu.com/chenxl

声智科技创始人陈孝良的专栏

数据集

http://www.speech.cs.cmu.edu/databases/an4/

The CMU Audio Databases。这个数据集非常老了(1991年),只有64M。

http://download.tensorflow.org/data/speech_commands_v0.01.tar.gz

TensorFlow提供的Speech Commands Datasets

还有相关的工具:

https://github.com/petewarden/extract_loudest_section

抽取一段wav文件中声音最大的那部分

https://www.kaggle.com/davids1992/speech-representation-and-data-exploration/notebook

包含对Speech Commands Datasets的数据处理过程的blog

https://catalog.ldc.upenn.edu/LDC93S1

TIMIT数据集(收费)

https://mp.weixin.qq.com/s/w9_D1_VVhk9md4RANaipDg

Mozilla开源语音识别模型和世界第二大语音数据集

http://www.voxforge.org/

VoxForge是一个非常活跃的众包语音识别数据库和经过训练的模型库

http://pan.baidu.com/s/1dEhUghz

清华大学语音和语言技术研究中心(CSLT)公开的数据集。这个数据集除了包含thchs30之外,还包含了其他几个小语种的数据集。

http://cn-mirror.openslr.org/18/

单独的thchs30数据集

http://blog.csdn.net/sut_wj/article/details/70662181

THCHS-30:一个免费的中文语料库

http://cn-mirror.openslr.org/33/

AISHELL数据库是THCHS-30之后,目前中文语音数据开源最大的数据库。

它是由北京希尔贝壳科技有限公司(http://www.aishelltech.com)录制的中文普通话数据。由400名来自不同方言区的发音人录制,男女比例均衡。按照设计好的文本,在相对安静环境中使用手机(Android和IOS系统)录制格式为16kHz、16bit单声道数据和高保真麦克风录制格式为44.1kHz、16bit单声道数据同时采集。

http://www.aishelltech.com/aishell_2

AISHELL-2的数据规模达到1000小时和更优秀的系统级recipe。数据目前以硬盘和网盘形式免费开放给高校科研教育机构。商用似乎还是要钱的。



另外本人还开设了个人公众号:JiandaoStudio ,会在公众号内定期发布行业信息,以及各类免费代码、书籍、大师课程资源。

 

                                            

扫码关注本人微信公众号,有惊喜奥!公众号每天定时发送精致文章!回复关键词可获得海量各类编程开发学习资料!

例如:想获得Python入门至精通学习资料,请回复关键词Python即可。

2018-11-30 13:27:16 manmanxiaowugun 阅读数 749
  • C++语音识别开篇

    本篇mark老师将教大家使用第三方库的调用来简单的实现语音识别。随着机器学习和人工智能的热闹,国内语音行业也可谓是百花齐放。 语音识别一个伟大的时代已在我们身边悄悄走来。

    6112 人正在学习 去看看 杨波

看了很多傅里叶变换(连续信号和离散信号)的博客,都写的不是很清楚,有些地方可能有误,我在查阅了书籍和大量资料以后,争取能用前后标注一致的公式把相关内容(帕斯瓦尔公式,能量信号,功率信号,能量谱,功率谱等)讲清楚,说正确。最好先看连续信号再看离散信号哦

连续信号的请看语音识别MFCC系列(一)——连续信号、傅里叶变换

离散信号的请看语音识别MFCC系列(二)——离散信号、离散傅里叶变换

耐不住的话直接看第五部分也行。下面将讲述:

  • 不连续     周期   信号的傅里叶  级数
  • 不连续  非周期  信号的傅里叶  变换
  • 离散傅里叶变换

一、不连续周期信号的傅里叶级数(DFS)

对一个连续周期信号x\left ( t \right )的一个周期T_0进行N点采样,得到离散序列x\left ( n\right ),则T _ { 0 } = N T_s\omega _ { 0 } = 2 \pi / T _ { 0 } = 2 \pi / (NT_s )T_s为采样周期,f_s为采样频率。

重现连续周期信号的傅里叶级数:

                                                                   x ( t ) = \sum _ { k = - \infty } ^ { \infty } X \left( k \omega _ { 0 } \right) e ^ { j k w _ { 0 } t }

                                                     X \left( k \omega _ { 0 } \right) = \frac { 1 } { T _ { 0 } } \int _ { 0 } ^ { T _ { 0 } } x ( t ) e ^ { - j k w _ { 0 } t } d t \quad k = 0,1,2 , \cdots

\Omega _ { 0 } = \omega _ { 0 } T_s = 2 \pi / N为离散域的基本频率,就是频率分辨率啦,就是最小的频率单元啦,各个频率分量的频率都是他的整数倍,\Omega =k \Omega _ { 0 }k次谐波的数字频率(下面会有例子解释哦)。因t = n T_s , d t = T_s,则:

                                    X \left( k \frac { \Omega _ { 0 } } { T_s } \right) = \frac { 1 } { N T_s } \sum _ { n = 0 } ^ { N - 1 } x ( n T_s ) \mathrm { e } ^ { - j k \frac { Q _ { 0 } } { T }n T_s } = \frac { 1 } { N } \sum _ { n = 0 } ^ { N - 1 } x ( n T_s ) \mathrm { e } ^ { - j k \Omega _ { 0 } n }

在序列表示中,可仅用n表示nT_s,用k \Omega _ { 0 }表示k \frac { \Omega _ { 0 } } { T_s },则上式为:

                                           X \left( k \Omega _ { 0 } \right) = \frac { 1 } { N } \sum _ { n = 0 } ^ { N - 1 } x ( n ) e ^ { - j k \Omega _ { 0 } n } \quad k = 0,1,2 , \cdots , N - 1

                                               x ( n ) = \sum _ { k = 0 } ^ { N - 1 } X \left( k \Omega _ { 0 } \right) e ^ { j k \frac { Q_ { 0 } } { T_s } nT_s}= \sum _ { k = 0 } ^ { N - 1 } X \left( k \Omega _ { 0 } \right) e ^ { j k \Omega _ { 0 } n }

当周期信号从连续域变换到离散域以后,它的频率\omega- \infty \sim + \infty映射到数字频率\Omega0 \sim 2 \pi。离散信号被分为N个频率分量,频率分辨率为2 \pi / N,根据连续信号的傅里叶级数同理,离散信号的傅里叶级数也有复共轭的性质,即X \left( k \Omega _ { 0 } \right) =X^* \left( -k \Omega _ { 0 } \right)

二、离散信号的帕斯瓦尔公式

                                                             \sum _ { k = 0 } ^ { N - 1 }\left |x ( n ) \right |^2=\frac{1}{N} \sum _ { k = 0 } ^ { N - 1 } \left |X \left( k \Omega _ { 0 } \right) \right |^2

推导就不写了,就是用上面那些式子推出来的(猜测对于周期信号,上式代表的是功率,对于长度有限的离散信号,上式代表的是能量)。

三、不连续非周期信号的傅里叶变换(DTFT)

哎呀这里和连续信号处理类似啦,所以连续信号一定要理解好哦!将长度有限的非周期信号x\left ( n\right ),以N为周期,将x\left ( n\right )延拓为周期信号x _ { N } ( n ),这里N要大于信号长度哦,那当N \rightarrow \infty时,\Omega _ { 0 } = 2 \pi / N \rightarrow \mathrm { d } \Omega , k \Omega _ { 0 } \rightarrow \Omega = \omega T_s为连续量,\sum _ { k = 0 } ^ { N - 1 } \rightarrow \int _ { 0 } ^ { 2 \pi }\frac { 1 } { N } = \frac { \Omega _ { 0 } } { 2 \pi } \rightarrow \frac { d \Omega } { 2 \pi } , x _ { N } ( n ) \rightarrow x ( n ),且这时X(k \Omega _ { 0 })趋于0,则乘个N,采用频谱密度表示频谱。

                                                  X ( \Omega ) = \lim _ { N \rightarrow \infty } N X \left( k \Omega _ { 0 } \right) = \sum _ { n = - \infty } ^ { n = \infty } x ( n ) e ^ { - j \Omega n }

                     x ( n ) = \lim _ { N \rightarrow \infty } x _ { N } ( n ) = \lim _ { N \rightarrow \infty } \sum _ { k = 0 } ^ { N - 1 } X \left( k \Omega _ { 0 } \right) e ^ { j k \Omega_ { 0 } n }= \lim _ { N \rightarrow \infty } \sum _ { k = 0 } ^ { N - 1 } \frac { 1 } { N } X ( \Omega ) \mathrm { e } ^ { \mathrm {j} \Omega n }=\frac{1}{2 \pi} \int _ { 0 } ^ { 2 \pi }X ( \Omega ) \mathrm { e } ^ { \mathrm {j} \Omega n }d \Omega

四、离散傅里叶变换(DFT)

因DTFT在频域是连续的,我们需要在时域和频域都是离散的离散傅里叶变换,将长度有限的非周期信号x\left ( n\right )x\left ( n\right )长度为N,以N为周期,将x\left ( n\right )延拓为周期信号x _ { p } ( n ),则DFS为:

                                           X_p \left( k \Omega _ { 0 } \right) = \frac { 1 } { N } \sum _ { n = 0 } ^ { N - 1 } x_p ( n ) e ^ { - j k \Omega_ { 0 } n } \quad k = 0,1,2 , \cdots , N - 1

                                                              x_p ( n ) = \sum _ { k = 0 } ^ { N - 1 } X_p \left( k \Omega _ { 0 } \right) e ^ { j k \Omega _ { 0 } n }

X_p \left( k \Omega _ { 0 } \right)x _ { p } ( n )都取主值区间0 \leq k \leq N - 1,则:

                                           X \left( k \Omega _ { 0 } \right) = \frac { 1 } { N } \sum _ { n = 0 } ^ { N - 1 } x ( n ) e ^ { - j k \Omega_ { 0 } n } \quad k = 0,1,2 , \cdots , N - 1

                                                              x ( n ) = \sum _ { k = 0 } ^ { N - 1 } X \left( k \Omega _ { 0 } \right) e ^ { j k \Omega _ { 0 } n }

将上式乘以N,用频谱密度来表示,简称频谱:

                                           X \left( k \right) =\sum _ { n = 0 } ^ { N - 1 } x ( n ) e ^ { - j k \Omega_ { 0 } n } \quad k = 0,1,2 , \cdots , N - 1

                                                              x ( n ) =\frac{1}{N} \sum _ { k = 0 } ^ { N - 1 } X \left( k \right) e ^ { j k \Omega _ { 0 } n }

因为X \left( k \right)是频谱密度,所以,当k=0时,X \left( k \right)对应的频率分量的波形峰值是\left |X \left( k \right) \right |\cdot N,当k\neq 0时,X \left( k \right)对应的频率分量的波形峰值是\frac{\left |X \left( k \right) \right |\cdot N}{2}。因为负频率的X ( k )和正频率共轭,所以当k为偶数时,只给N/2+1个点的频谱,最后一个点的频率为二分之一的采样频率,当k为奇数时,只给\frac{N+1}{2}个点的频谱,最后一个点的频率稍小于二分之一的采样频率。

五、奈奎斯特频率,频谱混叠和泄露

采样信号为

                              x _ { s } ( t ) = x ( t ) \delta _ { \mathrm { T } } ( t ) = x ( t ) \sum _ { n = - \infty } ^ { \infty } \delta \left( t - n T _ { s } \right) = \sum _ { n = - \infty } ^ { \infty } x \left( n T _ { s } \right) \delta \left( t - n T _ { s } \right)

对其做傅里叶变换得:

                                                          X_ { s } \left( \omega \right) = \frac { 1 } { T_ { s } } \sum _ { n = - \infty } ^ { \infty } X \left( \omega - n \omega _ { s } \right)

可知采样信号的傅里叶变换为原连续信号傅里叶变换周期延拓到以\pm \omega _ { s } , \pm 2 \omega _ { s },\cdots为中心的频谱,\omega _ { s }为采样角频率,奈奎斯特频率(Nyquist频率)是采样频率的一半,原信号傅里叶变换频谱的边缘是它本身的最高频率\omega _ { m },容易看出来当\omega _ { s }\geqslant 2\omega _ { m }才不会发生频谱混叠,也就是说奈奎斯特频率大于\omega _ { m }即可。

频谱泄露,就是比如本来只有频率为\frac{1}{2}Hz的分量,但是频谱中出现了和\frac{1}{2}Hz相近的分量。举个例子说明吧。

比如说有一段连续的周期信号,周期为2s,那么这段连续周期信号的傅里叶变换的基频f_0=\frac{1}{2}(就是上一篇博客的基本角频率\omega _0,其他频率分量的角频率都为\omega _0的倍数,f_0=\frac{\omega _0}{2\pi}),也就是说其他频率分量的频率都是f_0=\frac{1}{2}的整数倍,如果我们就截断2s的信号,那截断以后就是连续非周期信号了,那就要先周期延拓再做傅里叶变换,周期延拓后和截断前的信号一致,傅里叶变换也一致,频谱为一条线(在基频处有个分量)。如果截断4s的信号,周期延拓后和截断前的信号一致,傅里叶变换的基频为\frac{1}{4},那么频谱为一条线(在二倍频处有个分量),幅值与原来相同。但是如果截断3s的信号,周期延拓后在3s处有跳跃,容易产生高频分量,而且重要的是,傅里叶变换的基频为\frac{1}{3},按道理说频谱应该在1.5倍频处有个幅值,但是频谱中没有1.5倍频,只有1倍频,2倍频,那么频谱就会以1.5为中心的其他整数倍频处有分量,越靠近1.5幅值越大,和原来的不一致了!这就是频谱泄露!如下图所示:

根本解决方法是x(n)必须取自一个基本周期或基本周期的整数倍为宜。但有的时候我们截断的时候不知道基本周期,这时可以加长截取时间段,信号多一点能多代表一下整段信号吧,也可以加汉明窗等等窗函数,窗函数主要是减少旁瓣。可以参考下面几个网址看细致的分析和图,内容都类似,总有一个能打开:

                http://www.ni.com/white-paper/4844/zhs/

                https://zhuanlan.zhihu.com/p/24318554

                http://zhangzhenyuan163.blog.163.com/blog/static/85819389201410112942281/

                http://www.ilovematlab.cn/thread-30099-1-1.html

                http://www.chinaaet.com/article/15991

六、举个DFT的例子吧,通俗解释一下

1. 采样得到一段离散的信号,用包含100个数字的数字序列表示,其中前12个数字如下所示:

1.00, 0.62, -0.07, -0.87, -1.51, -1.81, -1.70, -1.24, -0.64, -0.15, 0.05, -0.10

我们将上述数字序列用x\left ( n \right )表示,n为某个数字在序列中的下标,如x ( 0 ) = 1.00x ( 1 ) = 0.62等。这里我们期待使用的信号是零均值信号,即数字序列的平均值为0,相当于每个数字减去了数字序列的平均值(下文会解释为什么这样做)。

我们希望求得一系列频率分量,将信号从时域转化到频域,使得上述数字序列为一系列频率分量之和。

2. 其次,什么是信号相关性?

下面这个公式不是严格意义上的相关性计算公式,只能说是在信号是零均值的情况下,一定程度上能反应相关性。

                                                                                 \sum _ { i = 0 } ^ { N } x ( i ) y ( i )

有两个信号xy,在信号是零均值的情况下,一定程度上他们越相关(比如同正同负),所求的和越大,但不绝对。例如下面的图a相关性大,和大,图b相关性小,和小。

3. 下面来解释离散傅里叶变换的公式!

                                                    X ( k ) = \sum _ { n = 0 } ^ { N - 1 } x ( n ) e ^ { -j 2 \pi k n / N },k=0,1,\cdots ,N-1

X ( k )代表的是某个频率分量的系数,这个式子很想上面求相关性的式子呀,求得是x(n)e ^ { - j2 \pi k n / N }的相关性,那到底是什么意思呢?先引入欧拉公式:

                                                                      e ^ { - j \theta } = \cos \theta - j \sin \theta

\theta = 2 \pi k n / N,则:

                                                    X ( k ) = \sum _ { n = 0 } ^ { N - 1 } x ( n ) ( \cos ( 2 \pi k n / N ) - j\sin ( 2 \pi k n / N ) )

                                             X ( k ) = \sum _ { n = 0 } ^ { N - 1 } x ( n ) \cos \left( \frac { 2 \pi k n } { N } \right) - j \left[ \sum _ { n = 0 } ^ { N - 1 } x ( n ) \sin \left( \frac { 2 \pi k n } { N } \right) \right]

可以看到X ( k )是个复数,被分为两部分,实轴为x(n)和某个频率的余弦函数的相关性,虚轴为x(n)和某个频率的正弦函数的相关性。

4. 当k变化的时候,上述相关性的意义到底是什么呢?

k=0

                                                \begin{aligned} X ( 0 ) & = \sum _ { n = 0 } ^ { N - 1 } x ( n ) \cos \left( \frac { 2 \pi 0 n } { N } \right) + j \sum _ { n = 0 } ^ { N - 1 } x ( n ) \sin \left( \frac { 2 \pi 0 n } { N } \right) \\ & = \sum _ { n = 0 } ^ { N - 1 } x ( n ) +j \sum _ { n = 0 } ^ { N - 1 } 0 \end{aligned}

意味着当分量频率为0的时候(即为一条直线),该分量的系数为数字序列中所有数字之和。

k=1

                                                \begin{aligned} X ( 1 ) & = \sum _ { n = 0 } ^ { N - 1 } x ( n ) \cos \left( \frac { 2 \pi 1 n } { N } \right) +j \sum _ { n = 0 } ^ { N - 1 } x ( n ) \sin \left( \frac { 2 \pi 1 n } { N } \right) \\ \end{aligned}

\cos \left( \frac { 2 \pi 1 n } { N } \right)代表什么?当n0N-1的时候,\frac { 2 \pi 1 n } { N }从0到2 \pi呀!这代表了所有的采样点仅代表一个周期!看下图a,正弦波是不是只有一个周期。图b代表上式的实数部分,图c代表上式的虚数部分。

 

k=3

                                                \begin{aligned} X ( 1 ) & = \sum _ { n = 0 } ^ { N - 1 } x ( n ) \cos \left( \frac { 2 \pi 3 n } { N } \right) + j \sum _ { n = 0 } ^ { N - 1 } x ( n ) \sin \left( \frac { 2 \pi 3 n } { N } \right) \\ \end{aligned}

\cos \left( \frac { 2 \pi 3 n } { N } \right)代表什么?当n0N-1的时候,\frac { 2 \pi 3 n } { N }从0到6 \pi呀!这代表了所有的采样点仅代表三个周期(2 \pi\ast 3可不就是三个周期吗)!看下图a,正弦波是不是只有三个周期。

k=N-1,所有的N个采样点代表了N-1个周期,约等于1个采样点代表一个周期,那么这个分量的周期是不是等于约采样周期了!这个分量的频率是不是约等于采样频率f_s了!

这时你再回看一下k=0k=1k=3,有没有发现,当从0到N-1时,频率分量的频率从0到f_s了!并且k对应的分量频率为f = \frac { k \times \mathrm { f_s } } { N },均匀分布哦!这个结论很重要哦!在求MFCC特征时会用到!

5.能量密度谱

能量密度谱为

                                                                    E\left ( k \right )= \frac{\operatorname { Re } ( X ( k ) ) ^ { 2 } + \operatorname { Im } ( X ( k ) ) ^ { 2 }}{N}

看上面的帕斯瓦尔公式。

上面已经解释过(具体的证明类似连续信号中的证明),当x\left ( n \right )均为实数时,负频率的X ( k )(对应的\pi2\pi,或者说-\pi到0)是正频率(对应的0到\pi)的共轭,P(k)=P(N-k)即,P(k)基于k=N/2成轴对称。比如说做一个N=512的DFT,因为负频率的X ( k )和正频率共轭,所以只给N/2+1个点的频谱,即257,因为多给没有意义啊,共轭的模是一样的。

六、总结

最后总结一句,信号可以分为多个频率分量的和,那么做离散傅里叶变换时,某个频率分量的幅值就是看信号和这个频率的正弦、余弦波形的相关性,如果信号中包含这个频率分量比较大,即幅值大,那肯定和这个频率的正弦、余弦波形的相关性更高呀,好好理解下这句话,就能大概记住傅里叶变换的求法了。

 

 

参考网址:

http://practicalcryptography.com/miscellaneous/machine-learning/intuitive-guide-discrete-fourier-transform/

https://blog.csdn.net/u011583927/article/details/45934455

http://www.ilovematlab.cn/thread-541003-1-1.html

没有更多推荐了,返回首页