千算萬算,不如FFT變換
前段時間,小外甥女家里出了一件大事。
本文引用地址:http://cafeforensic.com/article/201912/408433.htm不知道是不是要進入青春期的緣故,本來成績挺好的小外甥女成績開始不明所以地直線下降,大姐和大姐夫很是著急,幾番談心下來,卻也覺察不出十二歲的小家伙有啥異常。
是自己借口平時工作太忙,從來不輔導(dǎo)孩子做作業(yè)的緣故嗎?大姐心虛地捫心自問,可是轉(zhuǎn)念一想,之前也不曾輔導(dǎo)過的呀。是大姐夫成天不著家,四十來歲了還整天玩心不退,絲毫不管女兒的原因?應(yīng)該也不是,這么多年不都這么過來了嗎?于是,大姐更是丈二和尚摸不著頭腦了。
直到有一天,大姐夫偷偷看了女兒的手機,上了她的QQ,才算是破了案。原來,有一個混賬小屁孩對自己的乖乖女發(fā)起了凌厲的愛情攻勢,這個十來歲的臭小子是女兒的同班同學(xué),不知道從哪里學(xué)來的花言巧語,在QQ上面添油加醋加表情地向女兒表白,從女兒的回復(fù)來看,兩人似乎確立了“戀愛關(guān)系”。
看了不大會兒,大姐夫就血氣上涌,難以自持了,“他竟敢。。?!?。憤懣不已的大姐夫叫來大姐商量了一通之后,兩人一致認(rèn)為:
問題出在這萬惡的手機上!
然后他們拿出了針鋒相對的解決方案:跟那個小男孩家長談一談,嚴(yán)令他停止騷擾自己的女兒,同時最重要的,沒收女兒的手機!
不瞞各位,我聽說了這件雷人的事情之后,很是為外甥女感到悲哀。這兩口子的思路真的是很奇葩,出了這么大的事,不從根上找問題(父母是孩子的根),不怪自己嫌麻煩以及成天不著家不管孩子,反而怪罪“無善亦無惡,自性本無體”的手機!明明是自己不愿意付出時間和精力去關(guān)心孩子,卻把罪魁禍?zhǔn)自栽谑謾C頭上。但是,手機何罪之有哉?
沒收手機當(dāng)然很容易,但是,這樣就撲滅了女兒愛情的小火苗了嗎?解決方案固然簡單易行,但是能真正解決問題嗎?說白了,這是典型的避重就輕,為了回避繁難,故意對真相視而不見,是一種赤裸裸的自我欺騙!
但是且慢,我們這些工程師在日常的工作中好像也是這么一個毛病。面對一個難題,明明知道病根在哪里,正確的解決方案應(yīng)該是怎么樣的,但是因為害怕繁難,總是妄想著從枝節(jié)上縫縫補補,企圖通過簡單的方法蒙混過關(guān)。但是,萬法皆空因果不空,或遲或早,還是得跳進躲不掉的坑。
灑家就曾經(jīng)歷過類似的事情。
1
說起來,這也是好幾年前的事情了。
當(dāng)時的灑家三十出頭,意氣風(fēng)發(fā),一邊懷著熱騰騰的赤子之心報效國家,一邊帶著繞指的柔情掙錢養(yǎng)家。在公司任勞任怨的灑家,領(lǐng)導(dǎo)不給發(fā)錢只是一個勁兒地猛夸,還把大把的工作向我的肩上壓。這不,一個藍牙音頻設(shè)備的活就向我砸過來了呀!
在這個變化無窮的無情世界中,有情的人類通過發(fā)現(xiàn)規(guī)律、掌握規(guī)律指導(dǎo)自己征服世界、改造世界的實踐。其中有一條“二八定律”,特別反映了人類社會的運行規(guī)則。
比如說,這個世界上80%的財富都掌握在20%的人手中,再比如,大部分人類組織中,都是20%的高手承擔(dān)著80%的實質(zhì)性工作,大多數(shù)工作也是先花20%的時間完成其中的80%,然后再用80%的時間完成剩下20%的工作。
灑家這次也是這樣,不管它五五二十五,一頓操作猛如虎,不管它三七二十一,早點干完早休息,一個來月下來,這個藍牙音頻設(shè)備貌似就要快完工了。
直到我卡在了剩下20%的工作里。
2
光陰消漲,一身風(fēng)霜,任誰來到這世上,都要跌跌撞撞。鮮衣怒馬,仗劍天涯,有時候一塊豆腐也會撞得你頭暈眼花。
灑家撞上的這塊豆腐,是對聲音信號的采集與分析。
簡單來說吧,灑家這個音頻設(shè)備上有麥克風(fēng)和喇叭,出廠前要對麥克風(fēng)進行診斷,以確保它能正確地拾取聲音。大家都知道,人耳能聽到的聲音頻率區(qū)間是[20,20k]Hz,灑家就設(shè)計了一個方案,來判斷麥克風(fēng)的有效性。
具體過程為:產(chǎn)生一個1kHz的正弦信號,通過喇叭播放出來,麥克風(fēng)拾取了聲音后,在芯片內(nèi)部以一定的采樣頻率進行ADC轉(zhuǎn)換,然后,通過這些ADC數(shù)據(jù)判斷麥克風(fēng)能不能正確地拾取聲音。
熟悉信號與系統(tǒng)分析的同學(xué)們都知道,判斷一個固定頻率的正弦信號,最好的方式就是對時間域的信號進行傅里葉變換,然后在頻率域里做判斷,找出最大的頻率分量是不是1kHz,而且遠(yuǎn)遠(yuǎn)超過其它頻率分量就可以了。
但是,人又是一個無比感性的動物,之于一往無前永不回頭的時間,我們愛恨交織,時而發(fā)出逝者如斯夫的慨嘆,時而感受著它的溫柔和歲月靜好的恬淡。
所以,即便到了工程應(yīng)用中,一開始也是寧可在熟悉的時間域里頭打轉(zhuǎn)轉(zhuǎn)。當(dāng)然,更重要的一點是:信號與系統(tǒng)分析掌握起來比較難,上班多年,灑家早已經(jīng)把相關(guān)的知識還給老師了:)
3
其實無論是在時間域里還是在頻率域里做分析,面臨的第一個問題便是聲音信號采集的問題。這部分倒也簡單,所選處理器支持聲音信號的采樣,采它!
至于采樣率的選擇,學(xué)過香農(nóng)定理的同學(xué)肯定會搶答出來:聲音最高頻率20kHz,采樣率要大于最高頻率的兩倍,選擇44.1kHz準(zhǔn)沒錯。
但是,藝高人膽大的灑家卻沒有這樣選,原因也很簡單,咱輸出的聲音信號是1kHz,選擇那么高的采樣率太消耗RAM資源了,灑家一拍腦門,選擇了8kHz。
采樣之后的信號就是數(shù)字信號了,怎么處理呢?灑家?guī)е:挠洃浵肓讼敫道锶~變換,有些摸不著頭腦,于是便從時域下手了。
灑家是這樣想的:8kHz采樣率,每采八個點,便是一個周期了。每隔八個點判斷一下數(shù)據(jù)是否大致相等就可以了唄。
但是這么試了若干個周期,發(fā)現(xiàn)判斷結(jié)果時靈時不靈。灑家沉思片刻,便找到了答案。
在這個五濁的世界中,沒有任何一件事物是盡善盡美的,聲音信號也是如此。
從喇叭輸出到空氣中的傳播,到麥克風(fēng)的拾取,再到電路板上ADC采集電路中的干擾,本來純潔無瑕的聲音已經(jīng)背負(fù)了太多的噪聲!
咋辦?灑家再度沉思片刻,又找到了取巧的辦法。
將采樣率提高,進行過采樣,比如提高到48kHz,然后每6個點進行平均值濾波,把噪聲濾除掉,然后將這6個點求出的平均值視為一個點,再按照上面的方法判斷。
這么試了好多個周期,雖然有時還是判斷失敗,但是效果確實好多了!
4
過采樣+平均值濾波確實有效,但還不是足夠有效,咋辦?
通過傅里葉變換,在頻率域內(nèi)分析當(dāng)然是最有效的方案,但是這些知識都忘光了,又學(xué)不動咋辦?當(dāng)我調(diào)侃著向領(lǐng)導(dǎo)匯報困難時,領(lǐng)導(dǎo)也帶著令人捉摸不定的微笑對我調(diào)侃道:干不出來,不給你發(fā)工作,到時你咋辦?
咋辦,咋辦,領(lǐng)導(dǎo)的一句話把我逼上了梁山!
笨拙的人啊跌跌撞撞,總想投機取巧耍花槍,卻不曾想,誰的罪誰受誰的福誰享,不從根上解決問題,你能逃過“因果”的劍拔弩張?
當(dāng)我真的把目光轉(zhuǎn)向傅里葉變換時,才發(fā)現(xiàn)問題比我想得要簡單。因為,在MCU中進行離散傅里葉變換,有快速運算算法,就是半個世紀(jì)前就問世的FFT,而這部分已經(jīng)有了很成熟的代碼實現(xiàn),匯編版本的,C版本的,C++版本的不一而足。
這些代碼看不懂也沒關(guān)系,您可以先去測個智商,看看是不是沒到180:)
實際上,灑家也沒大看懂,把之前采集到的數(shù)據(jù)輸入到已有的FFT算法庫里就行了。
在這里唯一要注意的一點是,FFT進行的是占位運算,即輸入時間域信號,輸出頻率域信號,輸出數(shù)據(jù)直接存在了輸入數(shù)據(jù)的地址空間上。作判斷時,也很簡單,只需要知道哪個數(shù)據(jù)對應(yīng)著1kHz的頻率分量就可以了。
就以我這個應(yīng)用為例,8kHz采樣率,采了128個點做運算,經(jīng)過FFT運算之后,第一個數(shù)據(jù)便是8kHz/128,第二個數(shù)據(jù)是16kHz/128,。。。相應(yīng)地,第16個數(shù)據(jù)便是1kHz頻率分量的幅值。
就這樣,搞清楚了DFT和FFT的原理之后,問題輕松解決了!
后記
根據(jù)灑家多年的觀察,國內(nèi)的電子工程師普遍動手能力強,但是理論基礎(chǔ)差。本該掌握電子電路、電磁場、信號處理這三大類課程的電子信息類專業(yè)工程師,在日常的實踐中,只會拿著電子電路這一板斧揮舞,大家伙都把后兩部分尤其是信號處理自覺地屏蔽掉了。
究其原因,還是因為從難度上來比較,電子電路更容易掌握一些而已。電磁場和信號處理都涉及到數(shù)學(xué)物理這些比較燒腦的學(xué)科,大部分工程師為了挽救自己不斷后移的發(fā)際線,都自動自覺地把它們忘卻了。
但是,問題就在那里,不來也不去,沒有多方位全面的知識點以及對待問題的多個視角,你就很難從根上把問題解決掉。
再者,從本質(zhì)上看,知識沒有難易之分,難不難存乎一心,只要下心學(xué),還有學(xué)不會的?
評論