新聞中心

EEPW首頁 > 牛人業(yè)話 > 千算萬算,不如FFT變換

千算萬算,不如FFT變換

作者:小么哥 時(shí)間:2019-12-20 來源:電子產(chǎn)品世界 收藏

前段時(shí)間,小外甥女家里出了一件大事。

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

不知道是不是要進(jìn)入青春期的緣故,本來成績挺好的小外甥女成績開始不明所以地直線下降,大姐和大姐夫很是著急,幾番談心下來,卻也覺察不出十二歲的小家伙有啥異常。

是自己借口平時(shí)工作太忙,從來不輔導(dǎo)孩子做作業(yè)的緣故嗎?大姐心虛地捫心自問,可是轉(zhuǎn)念一想,之前也不曾輔導(dǎo)過的呀。是大姐夫成天不著家,四十來歲了還整天玩心不退,絲毫不管女兒的原因?應(yīng)該也不是,這么多年不都這么過來了嗎?于是,大姐更是丈二和尚摸不著頭腦了。

直到有一天,大姐夫偷偷看了女兒的手機(jī),上了她的QQ,才算是破了案。原來,有一個(gè)混賬小屁孩對自己的乖乖女發(fā)起了凌厲的愛情攻勢,這個(gè)十來歲的臭小子是女兒的同班同學(xué),不知道從哪里學(xué)來的花言巧語,在QQ上面添油加醋加表情地向女兒表白,從女兒的回復(fù)來看,兩人似乎確立了“戀愛關(guān)系”。

看了不大會(huì)兒,大姐夫就血?dú)馍嫌?,難以自持了,“他竟敢。。。”。憤懣不已的大姐夫叫來大姐商量了一通之后,兩人一致認(rèn)為:

問題出在這萬惡的手機(jī)上!

然后他們拿出了針鋒相對的解決方案:跟那個(gè)小男孩家長談一談,嚴(yán)令他停止騷擾自己的女兒,同時(shí)最重要的,沒收女兒的手機(jī)!

不瞞各位,我聽說了這件雷人的事情之后,很是為外甥女感到悲哀。這兩口子的思路真的是很奇葩,出了這么大的事,不從根上找問題(父母是孩子的根),不怪自己嫌麻煩以及成天不著家不管孩子,反而怪罪“無善亦無惡,自性本無體”的手機(jī)!明明是自己不愿意付出時(shí)間和精力去關(guān)心孩子,卻把罪魁禍?zhǔn)自栽谑謾C(jī)頭上。但是,手機(jī)何罪之有哉?

沒收手機(jī)當(dāng)然很容易,但是,這樣就撲滅了女兒愛情的小火苗了嗎?解決方案固然簡單易行,但是能真正解決問題嗎?說白了,這是典型的避重就輕,為了回避繁難,故意對真相視而不見,是一種赤裸裸的自我欺騙!

但是且慢,我們這些工程師在日常的工作中好像也是這么一個(gè)毛病。面對一個(gè)難題,明明知道病根在哪里,正確的解決方案應(yīng)該是怎么樣的,但是因?yàn)楹ε路彪y,總是妄想著從枝節(jié)上縫縫補(bǔ)補(bǔ),企圖通過簡單的方法蒙混過關(guān)。但是,萬法皆空因果不空,或遲或早,還是得跳進(jìn)躲不掉的坑。

灑家就曾經(jīng)歷過類似的事情。

1

說起來,這也是好幾年前的事情了。

當(dāng)時(shí)的灑家三十出頭,意氣風(fēng)發(fā),一邊懷著熱騰騰的赤子之心報(bào)效國家,一邊帶著繞指的柔情掙錢養(yǎng)家。在公司任勞任怨的灑家,領(lǐng)導(dǎo)不給發(fā)錢只是一個(gè)勁兒地猛夸,還把大把的工作向我的肩上壓。這不,一個(gè)藍(lán)牙音頻設(shè)備的活就向我砸過來了呀!

在這個(gè)變化無窮的無情世界中,有情的人類通過發(fā)現(xiàn)規(guī)律、掌握規(guī)律指導(dǎo)自己征服世界、改造世界的實(shí)踐。其中有一條“二八定律”,特別反映了人類社會(huì)的運(yùn)行規(guī)則。

比如說,這個(gè)世界上80%的財(cái)富都掌握在20%的人手中,再比如,大部分人類組織中,都是20%的高手承擔(dān)著80%的實(shí)質(zhì)性工作,大多數(shù)工作也是先花20%的時(shí)間完成其中的80%,然后再用80%的時(shí)間完成剩下20%的工作。

灑家這次也是這樣,不管它五五二十五,一頓操作猛如虎,不管它三七二十一,早點(diǎn)干完早休息,一個(gè)來月下來,這個(gè)藍(lán)牙音頻設(shè)備貌似就要快完工了。

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

2

光陰消漲,一身風(fēng)霜,任誰來到這世上,都要跌跌撞撞。鮮衣怒馬,仗劍天涯,有時(shí)候一塊豆腐也會(huì)撞得你頭暈眼花。

灑家撞上的這塊豆腐,是對聲音信號(hào)的采集與分析。

簡單來說吧,灑家這個(gè)音頻設(shè)備上有麥克風(fēng)和喇叭,出廠前要對麥克風(fēng)進(jìn)行診斷,以確保它能正確地拾取聲音。大家都知道,人耳能聽到的聲音頻率區(qū)間是[20,20k]Hz,灑家就設(shè)計(jì)了一個(gè)方案,來判斷麥克風(fēng)的有效性。

具體過程為:產(chǎn)生一個(gè)1kHz的正弦信號(hào),通過喇叭播放出來,麥克風(fēng)拾取了聲音后,在芯片內(nèi)部以一定的采樣頻率進(jìn)行ADC轉(zhuǎn)換,然后,通過這些ADC數(shù)據(jù)判斷麥克風(fēng)能不能正確地拾取聲音。

熟悉信號(hào)與系統(tǒng)分析的同學(xué)們都知道,判斷一個(gè)固定頻率的正弦信號(hào),最好的方式就是對時(shí)間域的信號(hào)進(jìn)行傅里葉變換,然后在頻率域里做判斷,找出最大的頻率分量是不是1kHz,而且遠(yuǎn)遠(yuǎn)超過其它頻率分量就可以了。

但是,人又是一個(gè)無比感性的動(dòng)物,之于一往無前永不回頭的時(shí)間,我們愛恨交織,時(shí)而發(fā)出逝者如斯夫的慨嘆,時(shí)而感受著它的溫柔和歲月靜好的恬淡。

所以,即便到了工程應(yīng)用中,一開始也是寧可在熟悉的時(shí)間域里頭打轉(zhuǎn)轉(zhuǎn)。當(dāng)然,更重要的一點(diǎn)是:信號(hào)與系統(tǒng)分析掌握起來比較難,上班多年,灑家早已經(jīng)把相關(guān)的知識(shí)還給老師了:)

3

其實(shí)無論是在時(shí)間域里還是在頻率域里做分析,面臨的第一個(gè)問題便是聲音信號(hào)采集的問題。這部分倒也簡單,所選處理器支持聲音信號(hào)的采樣,采它!

至于采樣率的選擇,學(xué)過香農(nóng)定理的同學(xué)肯定會(huì)搶答出來:聲音最高頻率20kHz,采樣率要大于最高頻率的兩倍,選擇44.1kHz準(zhǔn)沒錯(cuò)。

但是,藝高人膽大的灑家卻沒有這樣選,原因也很簡單,咱輸出的聲音信號(hào)是1kHz,選擇那么高的采樣率太消耗RAM資源了,灑家一拍腦門,選擇了8kHz。

采樣之后的信號(hào)就是數(shù)字信號(hào)了,怎么處理呢?灑家?guī)е:挠洃浵肓讼敫道锶~變換,有些摸不著頭腦,于是便從時(shí)域下手了。

灑家是這樣想的:8kHz采樣率,每采八個(gè)點(diǎn),便是一個(gè)周期了。每隔八個(gè)點(diǎn)判斷一下數(shù)據(jù)是否大致相等就可以了唄。

但是這么試了若干個(gè)周期,發(fā)現(xiàn)判斷結(jié)果時(shí)靈時(shí)不靈。灑家沉思片刻,便找到了答案。

在這個(gè)五濁的世界中,沒有任何一件事物是盡善盡美的,聲音信號(hào)也是如此。

從喇叭輸出到空氣中的傳播,到麥克風(fēng)的拾取,再到電路板上ADC采集電路中的干擾,本來純潔無瑕的聲音已經(jīng)背負(fù)了太多的噪聲!

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

將采樣率提高,進(jìn)行過采樣,比如提高到48kHz,然后每6個(gè)點(diǎn)進(jìn)行平均值濾波,把噪聲濾除掉,然后將這6個(gè)點(diǎn)求出的平均值視為一個(gè)點(diǎn),再按照上面的方法判斷。

這么試了好多個(gè)周期,雖然有時(shí)還是判斷失敗,但是效果確實(shí)好多了!

4

過采樣+平均值濾波確實(shí)有效,但還不是足夠有效,咋辦?

通過傅里葉變換,在頻率域內(nèi)分析當(dāng)然是最有效的方案,但是這些知識(shí)都忘光了,又學(xué)不動(dòng)咋辦?當(dāng)我調(diào)侃著向領(lǐng)導(dǎo)匯報(bào)困難時(shí),領(lǐng)導(dǎo)也帶著令人捉摸不定的微笑對我調(diào)侃道:干不出來,不給你發(fā)工作,到時(shí)你咋辦?

咋辦,咋辦,領(lǐng)導(dǎo)的一句話把我逼上了梁山!

笨拙的人啊跌跌撞撞,總想投機(jī)取巧?;?,卻不曾想,誰的罪誰受誰的福誰享,不從根上解決問題,你能逃過“因果”的劍拔弩張?

當(dāng)我真的把目光轉(zhuǎn)向傅里葉變換時(shí),才發(fā)現(xiàn)問題比我想得要簡單。因?yàn)?,在MCU中進(jìn)行離散傅里葉變換,有快速運(yùn)算算法,就是半個(gè)世紀(jì)前就問世的,而這部分已經(jīng)有了很成熟的代碼實(shí)現(xiàn),匯編版本的,C版本的,C++版本的不一而足。

這些代碼看不懂也沒關(guān)系,您可以先去測個(gè)智商,看看是不是沒到180:)

實(shí)際上,灑家也沒大看懂,把之前采集到的數(shù)據(jù)輸入到已有的算法庫里就行了。

在這里唯一要注意的一點(diǎn)是,進(jìn)行的是占位運(yùn)算,即輸入時(shí)間域信號(hào),輸出頻率域信號(hào),輸出數(shù)據(jù)直接存在了輸入數(shù)據(jù)的地址空間上。作判斷時(shí),也很簡單,只需要知道哪個(gè)數(shù)據(jù)對應(yīng)著1kHz的頻率分量就可以了。

就以我這個(gè)應(yīng)用為例,8kHz采樣率,采了128個(gè)點(diǎn)做運(yùn)算,經(jīng)過FFT運(yùn)算之后,第一個(gè)數(shù)據(jù)便是8kHz/128,第二個(gè)數(shù)據(jù)是16kHz/128,。。。相應(yīng)地,第16個(gè)數(shù)據(jù)便是1kHz頻率分量的幅值。

就這樣,搞清楚了DFT和FFT的原理之后,問題輕松解決了!

后記

根據(jù)灑家多年的觀察,國內(nèi)的電子工程師普遍動(dòng)手能力強(qiáng),但是理論基礎(chǔ)差。本該掌握電子電路、電磁場、信號(hào)處理這三大類課程的電子信息類專業(yè)工程師,在日常的實(shí)踐中,只會(huì)拿著電子電路這一板斧揮舞,大家伙都把后兩部分尤其是信號(hào)處理自覺地屏蔽掉了。

究其原因,還是因?yàn)閺碾y度上來比較,電子電路更容易掌握一些而已。電磁場和信號(hào)處理都涉及到數(shù)學(xué)物理這些比較燒腦的學(xué)科,大部分工程師為了挽救自己不斷后移的發(fā)際線,都自動(dòng)自覺地把它們忘卻了。

但是,問題就在那里,不來也不去,沒有多方位全面的知識(shí)點(diǎn)以及對待問題的多個(gè)視角,你就很難從根上把問題解決掉。

再者,從本質(zhì)上看,知識(shí)沒有難易之分,難不難存乎一心,只要下心學(xué),還有學(xué)不會(huì)的?



關(guān)鍵詞: FFT 信號(hào)分析

評論


相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉