深入淺出解釋FFT(三) 去掉頻譜中的直流分量

2021-07-29 22:42:51 字數 2597 閱讀 9593

不論是fft還是dct或者其它變換中,都存在將直流分量置零的方法。比如將訊號的一階導數進行fft變換後置零直流分量。

在模擬部分的電路中,不少元件(如放大器)輸出會有直流漂移(即輸出應該為零時,實際上是乙個直流電壓)。這個漂移會對下一級的放大等功能發生影響。所以通常在各級之間採用交流耦合(最簡單的就是用乙個電容隔開)。這樣,訊號的直流部分也就不能通過。所以在接收端,所有的直流分量都來自於系統的直流漂移,需要除掉。

另一種情況是模擬電路之間需要阻抗匹配時(如音訊放大器和揚聲器之間),最簡單的方法是用變壓器耦合。這時直流也不能通過。

訊號處理中的另一種情況是需要提取寄生在很大直流訊號上的乙個很小的交變訊號。這時候也需要去除直流訊號。最簡便的辦法就是傅利葉變換後把直流分量置零。

經常會聽說訊號做頻譜變換後要做去除直流分量的處理,我想請教其理論和具體實現。請大家不吝賜教。

我這裡有乙個例子,在一正弦訊號和一線性訊號中加入直流成分。做頻譜變換,得到的結果從圖上看也確實存在直流成分的干擾,確實需要去除。但我這裡是事先已知直流成分。更一般的情況是,對於訊號,我們根本不確定是否有直流成分,或者不知道直流成分為多少,對之進行採集,做頻譜變換。那麼,我們該怎樣對頻譜做處理,才能消除其中由被採集訊號的直流成分導致的誤差呢?

我的程式是:

clear,clc

close all

x = 0:1/1024:1-1/1024;

y = sin(2*pi*10*x);

z = fft(y);

figure

stem(-512:511,abs(fftshift(z))/1024);

y = y+ 0.1;

z2 = fft(y);

figure

stem(-512:511,abs(fftshift(z2))/1024);

a=0:1023;

b=fft(a);

figure

stem(-512:511,abs(fftshift(b))/1024);

a = a+50;

b2=fft(a);

figure

stem(-512:511,abs(fftshift(b2))/1024);

a=2.*[0:1023];

a = a+50;

b3=fft(a);

figure

stem(-512:511,abs(fftshift(b3))/1024);

影象就不附在這裡了。

觀察影象,可以看到,對一正弦訊號加了直流分量,變換後直流成分只影響0頻,(並且大小剛好是0.1,這是什麼意思呢?)此時將0頻的訊號去掉即可得到準確的頻譜。那麼,是對所有訊號都可以這樣處理麼?直接將變換後0頻幅值變為0,就去掉了直流成分的影響?

——但這對於線性訊號顯然不行。

對於線性訊號,無論是頻率為多少,變換結果都是在0頻上有值,且加直流成分後值會變大。這裡我又有兩個問題:

1、為什麼我設定的頻率明明為1或2,也就是斜率為1或2,變換的頻率主峰值卻是0?

2、不加直流成分時,0頻值代表什麼?均值?還是有效值?還是其他?

1  通常數碼訊號去直流直接減去個均值就可以了,matlab去直流加線性趨勢項的函式為detrend,頻率1或2和斜率1或2是不等價的,0頻可以認為是直流

2  為什麼是0.1,傅利葉變換的公式,代入頻率為0,看一下就知道了。這也是為什麼去均值可以作為去直流的乙個手段。當然取決於你的直流分量怎麼定義,去均值這個只能去平穩訊號的直流分量,象你的線性訊號,它不是乙個平穩訊號,所以很多你看到的結論都是不適用的,從你的結果來看,你要看線性訊號的頻譜,不嚴格地想一下,你的線性訊號根本沒有週期性,也就是所週期是無窮遠,所以所有的訊號都可以認為是直流分量

4  謝謝解答哦。通常是那樣處理的,detrend函式也見過。斜率和頻率確實不是一回事,搞混啦。但是我覺得斜率為1的訊號其頻率不該是0啊,不該出現在0頻上,而現在,0頻為何有那麼大的幅值?也就是說,不加直流成分的線性訊號應該在0頻沒有值才對呀。而且,實際上,0頻幅值代表的是訊號均值,這是為什麼呢?

將所有訊號點減去均值,再做變換,確實沒有0頻分量,但是變換結果就不知道啥意思了:

5  你這種的線性趨勢相當於y=kx+0.5,所以你的直流為0.5,減去均值後就沒有了,所謂線性趨勢一般都緩變趨勢項,自然是含有很多低頻資訊了,如果你對訊號做傅利葉變換。應該是像sa函式和余弦的混合(我好像看過,但自己沒做過)。那是加窗,你的訊號有限長,所以相當於你的訊號頻譜和sinc卷積

6  最開始應該理解不對,忘記了連續和離散的差別,訊號的頻率和斜率沒有直接關係,但是你這種的離散線性趨勢和你資料的長度有直接關係,例如你的資料長度是1s,那自然你的1hz處頻率最大,資料2s,頻率就會0.5最大,而這個訊號不是正弦,所以肯定存在其他分量。斜率不同其實就是導致數值不同,可以認為是幅度不同,但形狀是相同的,其實這取決於fft,因為fft是週期延拓的,而很顯然對於直流線性趨勢的週期就是資料的長度,注意這和正弦訊號有大大的不同。其實之前版主說的也應該就是這個意思。

深入淺出解釋FFT(二) fft對訊雜比影響

這幾天在做pipelined adc的動態特性的 如snr,thd,sndr.既然是動態特性,就不可避免地要用到fft,因此這幾天研究了一些關於fft的東西,同時收集了一些公司 個人的snr測試 程式,小有收穫,同時還有些疑點,故開此討論貼,希望能有高人點撥一二,同時將自己的心得與各位分享。首先說f...

深入淺出MySQL筆記(三)

本筆記為學習該書所記,便於複習。包含第五 六章筆記。常用函式與圖形化工具的使用。toc 常用字串函式 concat s1,s2.sn 連線s1,s2.sn為乙個字串 insert str,x,y,instr 將字串str從第x位置開始,y個字元長的子串替換為字串instr lower str 將字串...

《深入淺出MFC》筆記(三)

1,win32 console程式示例 include include include include const int filemax 300 allow max.300 files in each directory typedef struct destfile destfile typed...