一般這種問(wèn)題,我們都會(huì)說(shuō)是時(shí)鐘線引起的問(wèn)題。我之前做的產(chǎn)品是攝像頭,時(shí)鐘線加十幾根數(shù)據(jù)線。有一次處理完時(shí)鐘線后還是超標(biāo),因?yàn)檎脭?shù)據(jù)線上都串有電阻,我就將電阻都改成了磁珠,想消除因?yàn)閿?shù)據(jù)線引起的輻射,改完之后發(fā)現(xiàn)還是超標(biāo),看不到有明顯的改善。
從那時(shí),我就知道了,輻射一般都是時(shí)鐘線引起的,與數(shù)據(jù)線關(guān)系不大。不過(guò)那時(shí),我一直都不明白為什么會(huì)如此。
因?yàn)樵谖铱磥?lái),時(shí)鐘線和數(shù)據(jù)線的上升沿都差不多,按說(shuō)頻率分量應(yīng)該是一樣的呀。雖然時(shí)鐘線的高低電平交替變化會(huì)多一些,但是數(shù)據(jù)線有十幾根了,難道加起來(lái)還比不上時(shí)鐘線嗎?
實(shí)際上數(shù)據(jù)加起來(lái)還真比不上時(shí)鐘線。
關(guān)于這一點(diǎn),理論可以這么解釋:周期信號(hào)由于每個(gè)取樣段的頻譜都是一樣的,所以他的頻譜呈離散形,但在各個(gè)頻點(diǎn)上比較大,通常成為窄帶噪聲。而非周期信號(hào),由于其每個(gè)取樣段的頻譜不一樣,所以其頻譜很寬,而且強(qiáng)度較弱,通常被稱為寬帶噪聲。然而在一般系統(tǒng)中,時(shí)鐘信號(hào)為周期信號(hào),而數(shù)據(jù)和地址線通常為非周期信號(hào),因此造成系統(tǒng)輻射超標(biāo)的通常為時(shí)鐘信號(hào)。
不過(guò)呢,這一段話本身就是一個(gè)結(jié)論,說(shuō)服力不強(qiáng),也就有點(diǎn)不敢相信。下面還是來(lái)做個(gè)實(shí)驗(yàn)?zāi)M下,我們會(huì)發(fā)現(xiàn)新東西。實(shí)驗(yàn)思路很簡(jiǎn)單,那就是分別得到時(shí)鐘線和數(shù)據(jù)線的頻譜,兩者比較下就知道了。
構(gòu)建時(shí)鐘和數(shù)據(jù)信號(hào)
我們使用MATLAB來(lái)分析頻譜,首先需要構(gòu)建時(shí)鐘和數(shù)據(jù)信號(hào)。
時(shí)鐘信號(hào)很容易,就是高低電平交替變化。正常情況下,數(shù)據(jù)線都是不規(guī)律的,那就采用隨機(jī)生成的方式。
構(gòu)建時(shí)鐘和數(shù)據(jù)信號(hào)如下圖。
構(gòu)建時(shí)鐘CLK和10根數(shù)據(jù)線如上圖。說(shuō)明一下,為了減小運(yùn)算量(軟件運(yùn)行時(shí)間),時(shí)鐘頻率設(shè)置為1Hz。
得到頻譜
我們分別畫出時(shí)鐘的頻譜,1根數(shù)據(jù)線的頻譜,10根數(shù)據(jù)線頻譜的疊加。
需要注意的是,因?yàn)閿?shù)據(jù)線的數(shù)據(jù)是非周期的,我們盡量時(shí)間取長(zhǎng)一點(diǎn),下圖分析的數(shù)據(jù)長(zhǎng)度為Num_T=1000個(gè)時(shí)鐘周期。
從圖可以看出,周期性時(shí)鐘信號(hào)的頻譜是離散的,非常典型,這個(gè)相信大家已經(jīng)見(jiàn)過(guò)多次了,而數(shù)據(jù)線的頻譜是比較寬的。這與文章最前面說(shuō)的是一致的。
并且,圖中右下角有1根數(shù)據(jù)線和10根數(shù)據(jù)線相加的頻譜。我們也可以看到,10根數(shù)據(jù)線相加之和,幅度最高的頻譜分量幅度值大概是0.4左右,而時(shí)鐘的基頻分量最高為0.6,也就是說(shuō)數(shù)據(jù)線加起來(lái),確實(shí)抵不過(guò)CLK時(shí)鐘信號(hào)。
一個(gè)問(wèn)題猜測(cè)
前面的頻譜分析有一個(gè)前提條件,那就是,取樣的時(shí)間長(zhǎng)度是Num_T=1000個(gè)時(shí)鐘周期,即分析的數(shù)據(jù)長(zhǎng)度是1000個(gè)時(shí)鐘周期的數(shù)據(jù)。
我發(fā)現(xiàn),如果把時(shí)間長(zhǎng)度提升10倍,Num_T=10000。那么10根數(shù)據(jù)線相加的頻譜幅度值就更低了,大概只有0.1左右,比原來(lái)要低不少,而時(shí)鐘的頻譜不變。
增加取樣時(shí)間,數(shù)據(jù)線頻譜幅度降低的原因。是因?yàn)槲沂褂昧薓atalb里面的fft函數(shù),這個(gè)函數(shù)是將信號(hào)看作周期函數(shù)來(lái)處理的,就是說(shuō)假定取樣時(shí)間長(zhǎng)度為T,那么就默認(rèn)這個(gè)信號(hào)是周期函數(shù),周期長(zhǎng)度為T。數(shù)據(jù)線信號(hào)本來(lái)是非周期的,如果用這個(gè)函數(shù),那么其實(shí)就是讓數(shù)據(jù)線信號(hào)的周期為采用時(shí)間長(zhǎng)度,這也是為什么時(shí)間設(shè)得越短,幅度值越高。采用時(shí)間越短,其實(shí)不就是讓數(shù)據(jù)線向周期信號(hào)靠攏嗎。
所以,這個(gè)采樣時(shí)間長(zhǎng)度長(zhǎng)一些,應(yīng)該是更為準(zhǔn)確的。
不過(guò)問(wèn)題又來(lái)了。我突然想到,我們做輻射測(cè)試用的頻譜分析儀,它工作的時(shí)候,我們可以在頻譜上面看到各個(gè)頻率對(duì)應(yīng)的幅值。所以它肯定不是從開(kāi)始掃描,到結(jié)束掃描,只記錄一次數(shù)據(jù)然后最后分析一次。應(yīng)該也是連續(xù)取一段時(shí)間數(shù)據(jù),因?yàn)槲覀兛梢詫?shí)時(shí)看到當(dāng)前的頻譜,并且它是變化的,所以會(huì)是取一段時(shí)間數(shù)據(jù),分析出頻譜,然后顯示出來(lái),再取下一段時(shí)間的數(shù)據(jù)進(jìn)行分析。
當(dāng)然,以上只是我的猜測(cè)。那么它到底一次分析多長(zhǎng)的數(shù)據(jù)呢?這個(gè)我也沒(méi)查到。
對(duì)于10Mhz的信號(hào),如果取樣10000個(gè)周期的數(shù)據(jù),那么時(shí)間長(zhǎng)度是1ms。這已經(jīng)是一個(gè)很快的頻次了。從上面看,此時(shí)10根數(shù)據(jù)線加起來(lái)的頻譜幅度最大值才0.1,比時(shí)鐘小不少。
實(shí)驗(yàn)源碼
下面分享下matlab源碼,可以修改里面采樣的信號(hào)時(shí)間長(zhǎng)度Num_T,體驗(yàn)一下。
注:Matlab可以在線執(zhí)行的,沒(méi)安裝的同學(xué)可以網(wǎng)頁(yè)上面執(zhí)行,下面是網(wǎng)頁(yè)鏈接,我先前也出了一個(gè)簡(jiǎn)易的教程,有興趣可以看看。
https://ww2.mathworks.cn/products/matlab-online.html
Fclk=1; %時(shí)鐘頻率為1Hz
Num_T=1000; %信號(hào)長(zhǎng)度為1000個(gè)時(shí)鐘周期
Num_Data=10; %數(shù)據(jù)線的個(gè)數(shù)10個(gè)
%%%%%%%%%%%%%%%%%%%%%%%% fft采樣設(shè)置
Fs=100; %采樣率為Fs
L=(Fs/Fclk)*Num_T; %信號(hào)長(zhǎng)度(采樣總點(diǎn)數(shù)):Num_T個(gè)周期的信號(hào),長(zhǎng)度越長(zhǎng),fft精度越高,但是執(zhí)行時(shí)間越長(zhǎng)
T=1/Fs; %采樣周期
t=(1:L)*T; %時(shí)間長(zhǎng)度
%SIG_DATA=round(rand(Num_Data,2*Num_T)); %產(chǎn)生數(shù)據(jù)信號(hào):0,1隨機(jī)分布
SIG_DATA=round(rand(Num_Data,Num_T)); %產(chǎn)生數(shù)據(jù)信號(hào):0,1隨機(jī)分布
SIG_CLK=rand(1,2*Num_T); %產(chǎn)生時(shí)鐘信號(hào)
for i = 1:length(SIG_CLK)
if mod(i,2)
SIG_CLK(i)=1;
else
SIG_CLK(i)=0;
end
end
N=length(t);
LEN_CLK=zeros(1,N); %定義時(shí)鐘信號(hào)采樣序列
LEN_DATA=zeros(Num_Data,N); %定義數(shù)據(jù)信號(hào)采樣序列
for i=1:N
LEN_CLK(i)=SIG_CLK(ceil(i/((Fs/Fclk)/2))); %時(shí)鐘信號(hào)的采樣序列
for j=1:Num_Data
% LEN_DATA(j,i)=SIG_DATA(j,ceil(i/((Fs/Fclk)/2))); %數(shù)據(jù)信號(hào)的采樣序列
LEN_DATA(j,i)=SIG_DATA(j,ceil(i/(Fs/Fclk))); %數(shù)據(jù)信號(hào)的采樣序列
end
end
figure;
subplot(2,2,[1 2]);
plot(t,LEN_CLK+1.5*Num_Data,''''r''''); %畫出30個(gè)時(shí)鐘周期時(shí)鐘信號(hào)
set(gca,''''XLim'''',[0 30]);%x軸的數(shù)據(jù)顯示范圍,0-30
set(gca,''''ytick'''',[]);
grid on;
hold on
for j=1:Num_Data
plot(t,LEN_DATA(j,:)+(j-1)*1.5,''''k'''');
hold on
end
X_LEN_CLK=abs(fft(LEN_CLK));
subplot(2,2,3);
semilogx(Fs*(0:(L/2))/L,X_LEN_CLK(1:L/2+1)*2/L);
set(gca,''''XLim'''',[0.1 10000]);%x軸的數(shù)據(jù)顯示范圍
set(gca, ''''XTickLabel'''' ,{''''0.1'''',''''1'''',''''10'''',''''100'''',''''10K'''',''''100K''''}); %x軸頻率數(shù)據(jù)
title(''''時(shí)鐘頻譜'''');
set(gca,''''YLim'''',[-0.1 1]);
xlabel(''''f (Hz)'''');
ylabel(''''幅度'''');
X1_LEN_DATA= abs(fft(LEN_DATA(1,:)));
X_LEN_DATA = abs(fft(LEN_DATA(1,:)));
for j=2:Num_Data
X_LEN_DATA = abs(fft(LEN_DATA(j,:)))+X_LEN_DATA;
end
subplot(2,2,4);
semilogx(Fs*(0:(L/2))/L,X_LEN_DATA(1:L/2+1)*2/L,Fs*(0:(L/2))/L,X1_LEN_DATA(1:L/2+1)*2/L);
legend(['''''''',num2str(Num_Data),''''根-數(shù)據(jù)線''''],['''' 1根-數(shù)據(jù)線'''']);
set(gca,''''XLim'''',[0.1 10000]);%x軸的數(shù)據(jù)顯示范圍
set(gca, ''''XTickLabel'''' ,{''''0.1'''',''''1'''',''''10'''',''''100'''',''''10K'''',''''100K''''}); %x軸頻率數(shù)據(jù)
title(['''''''',num2str(Num_Data),''''數(shù)據(jù)線頻譜'''']);
set(gca,''''YLim'''',[-0.1 1]);
xlabel(''''f (Hz)'''');
ylabel(''''幅度'''');
(來(lái)源:硬件工程師煉成之路)