新闻中心

EEPW首页 > 牛人业话 > 千算万算,不如FFT变换

作者:小么哥时间:2019-12-20来源:电子产品世界

前段时间,小外甥女家里出了一件大事。

本文引用地址:http://www.aiyaf.cn/article/201912/408433.htm

不知道是不是要进入青春期的缘故,本来成绩挺好的小外甥女成绩开始不明所以地直线下降,大姐和大姐夫很是着急,几番谈心下来,却也觉察不出十二岁的小家伙有啥异常。

是自己借口平时工作太忙,从来不辅导孩子做作业的缘故吗?大姐心虚地扪心自问,可是转念一想,之前也不曾辅导过的呀。是大姐夫成天不着家,四十来岁了还整天玩心不退,丝毫不管女儿的原因?应该也不是,这么多年不都这么过来了吗?于是,大姐更是丈二和尚摸不着头脑了。

直到有一天,大姐夫偷偷看了女儿的手机,上了她的QQ,才算是破了案。原来,有一个混账小屁孩对自己的乖乖女发起了凌厉的爱情攻势,这个十来岁的臭小子是女儿的同班同学,不知道从哪里学来的花言巧语,在QQ上面添油加醋加表情地向女儿表白,从女儿的回复来看,两人似乎确立了“恋爱关系”。

看了不大会儿,大姐夫就血气上涌,难以自持了,“他竟敢。。。”。愤懑不已的大姐夫叫来大姐商量了一通之后,两人一致认为:

问题出在这万恶的手机上!

然后他们拿出了针锋相对的解决方案:跟那个小男孩家长谈一谈,严令他停止骚扰自己的女儿,同时最重要的,没收女儿的手机!

不瞒各位,我听说了这件雷人的事情之后,很是为外甥女感到悲哀。这两口子的思路真的是很奇葩,出了这么大的事,不从根上找问题(父母是孩子的根),不怪自己嫌麻烦以及成天不着家不管孩子,反而怪罪“无善亦无恶,自性本无体”的手机!明明是自己不愿意付出时间和精力去关心孩子,却把罪魁祸首栽在手机头上。但是,手机何罪之有哉?

没收手机当然很容易,但是,这样就扑灭了女儿爱情的小火苗了吗?解决方案固然简单易行,但是能真正解决问题吗?说白了,这是典型的避重就轻,为了回避繁难,故意对真相视而不见,是一种赤裸裸的自我欺骗!

但是且慢,我们这些工程师在日常的工作中好像也是这么一个毛病。面对一个难题,明明知道病根在哪里,正确的解决方案应该是怎么样的,但是因为害怕繁难,总是妄想着从枝节上缝缝补补,企图通过简单的方法蒙混过关。但是,万法皆空因果不空,或迟或早,还是得跳进躲不掉的坑。

洒家就曾经历过类似的事情。

1

说起来,这也是好几年前的事情了。

当时的洒家三十出头,意气风发,一边怀着热腾腾的赤子之心报效国家,一边带着绕指的柔情挣钱养家。在公司任劳任怨的洒家,领导不给发钱只是一个劲儿地猛夸,还把大把的工作向我的肩上压。这不,一个蓝牙音频设备的活就向我砸过来了呀!

在这个变化无穷的无情世界中,有情的人类通过发现规律、掌握规律指导自己征服世界、改造世界的实践。其中有一条“二八定律”,特别反映了人类社会的运行规则。

比如说,这个世界上80%的财富都掌握在20%的人手中,再比如,大部分人类组织中,都是20%的高手承担着80%的实质性工作,大多数工作也是先花20%的时间完成其中的80%,然后再用80%的时间完成剩下20%的工作。

洒家这次也是这样,不管它五五二十五,一顿操作猛如虎,不管它三七二十一,早点干完早休息,一个来月下来,这个蓝牙音频设备貌似就要快完工了。

直到我卡在了剩下20%的工作里。

2

光阴消涨,一身风霜,任谁来到这世上,都要跌跌撞撞。鲜衣怒马,仗剑天涯,有时候一块豆腐也会撞得你头晕眼花。

洒家撞上的这块豆腐,是对声音信号的采集与分析。

简单来说吧,洒家这个音频设备上有麦克风和喇叭,出厂前要对麦克风进行诊断,以确保它能正确地拾取声音。大家都知道,人耳能听到的声音频率区间是[20,20k]Hz,洒家就设计了一个方案,来判断麦克风的有效性。

具体过程为:产生一个1kHz的正弦信号,通过喇叭播放出来,麦克风拾取了声音后,在芯片内部以一定的采样频率进行ADC转换,然后,通过这些ADC数据判断麦克风能不能正确地拾取声音。

熟悉信号与系统分析的同学们都知道,判断一个固定频率的正弦信号,最好的方式就是对时间域的信号进行傅里叶变换,然后在频率域里做判断,找出最大的频率分量是不是1kHz,而且远远超过其它频率分量就可以了。

但是,人又是一个无比感性的动物,之于一往无前永不回头的时间,我们爱恨交织,时而发出逝者如斯夫的慨叹,时而感受着它的温柔和岁月静好的恬淡。

所以,即便到了工程应用中,一开始也是宁可在熟悉的时间域里头打转转。当然,更重要的一点是:信号与系统分析掌握起来比较难,上班多年,洒家早已经把相关的知识还给老师了:)

3

其实无论是在时间域里还是在频率域里做分析,面临的第一个问题便是声音信号采集的问题。这部分倒也简单,所选处理器支持声音信号的采样,采它!

至于采样率的选择,学过香农定理的同学肯定会抢答出来:声音最高频率20kHz,采样率要大于最高频率的两倍,选择44.1kHz准没错。

但是,艺高人胆大的洒家却没有这样选,原因也很简单,咱输出的声音信号是1kHz,选择那么高的采样率太消耗RAM资源了,洒家一拍脑门,选择了8kHz。

采样之后的信号就是数字信号了,怎么处理呢?洒家带着模糊的记忆想了想傅里叶变换,有些摸不着头脑,于是便从时域下手了。

洒家是这样想的:8kHz采样率,每采八个点,便是一个周期了。每隔八个点判断一下数据是否大致相等就可以了呗。

但是这么试了若干个周期,发现判断结果时灵时不灵。洒家沉思片刻,便找到了答案。

在这个五浊的世界中,没有任何一件事物是尽善尽美的,声音信号也是如此。

从喇叭输出到空气中的传播,到麦克风的拾取,再到电路板上ADC采集电路中的干扰,本来纯洁无瑕的声音已经背负了太多的噪声!

咋办?洒家再度沉思片刻,又找到了取巧的办法。

将采样率提高,进行过采样,比如提高到48kHz,然后每6个点进行平均值滤波,把噪声滤除掉,然后将这6个点求出的平均值视为一个点,再按照上面的方法判断。

这么试了好多个周期,虽然有时还是判断失败,但是效果确实好多了!

4

过采样+平均值滤波确实有效,但还不是足够有效,咋办?

通过傅里叶变换,在频率域内分析当然是最有效的方案,但是这些知识都忘光了,又学不动咋办?当我调侃着向领导汇报困难时,领导也带着令人捉摸不定的微笑对我调侃道:干不出来,不给你发工作,到时你咋办?

咋办,咋办,领导的一句话把我逼上了梁山!

笨拙的人啊跌跌撞撞,总想投机取巧耍花枪,却不曾想,谁的罪谁受谁的福谁享,不从根上解决问题,你能逃过“因果”的剑拔弩张?

当我真的把目光转向傅里叶变换时,才发现问题比我想得要简单。因为,在MCU中进行离散傅里叶变换,有快速运算算法,就是半个世纪前就问世的,而这部分已经有了很成熟的代码实现,汇编版本的,C版本的,C++版本的不一而足。

这些代码看不懂也没关系,您可以先去测个智商,看看是不是没到180:)

实际上,洒家也没大看懂,把之前采集到的数据输入到已有的算法库里就行了。

在这里唯一要注意的一点是,进行的是占位运算,即输入时间域信号,输出频率域信号,输出数据直接存在了输入数据的地址空间上。作判断时,也很简单,只需要知道哪个数据对应着1kHz的频率分量就可以了。

就以我这个应用为例,8kHz采样率,采了128个点做运算,经过FFT运算之后,第一个数据便是8kHz/128,第二个数据是16kHz/128,。。。相应地,第16个数据便是1kHz频率分量的幅值。

就这样,搞清楚了DFT和FFT的原理之后,问题轻松解决了!

后记

根据洒家多年的观察,国内的电子工程师普遍动手能力强,但是理论基础差。本该掌握电子电路、电磁场、信号处理这三大类课程的电子信息类专业工程师,在日常的实践中,只会拿着电子电路这一板斧挥舞,大家伙都把后两部分尤其是信号处理自觉地屏蔽掉了。

究其原因,还是因为从难度上来比较,电子电路更容易掌握一些而已。电磁场和信号处理都涉及到数学物理这些比较烧脑的学科,大部分工程师为了挽救自己不断后移的发际线,都自动自觉地把它们忘却了。

但是,问题就在那里,不来也不去,没有多方位全面的知识点以及对待问题的多个视角,你就很难从根上把问题解决掉。

再者,从本质上看,知识没有难易之分,难不难存乎一心,只要下心学,还有学不会的?



关键词: FFT 信号分析

评论


相关推荐

技术专区

关闭