當(dāng)前位置: 首頁(yè) > 工業(yè)電子產(chǎn)品 > 其他電子產(chǎn)品 > 開發(fā)板,套件,編程器 > 開發(fā)板
發(fā)布日期:2022-10-14 點(diǎn)擊率:40
成型濾波就是通過(guò)對(duì)數(shù)字基帶信號(hào)的處理把信號(hào)的頻譜壓縮在一定的帶寬內(nèi)。先看一張圖,就是矩形脈沖信號(hào)的頻譜,這張圖是用別人的代碼畫出來(lái)的,比我的代碼畫的好,畢竟人家是專業(yè)的。
很明顯,如果不對(duì)這個(gè)頻譜做限制,那么它將會(huì)占用特別大的帶寬,在實(shí)際的無(wú)線通信產(chǎn)品中,根本沒(méi)有這種頻譜的產(chǎn)品。用比較專業(yè)的一點(diǎn)的方式描述,成型濾波有兩個(gè)作用:
(1)頻譜壓縮,限制信號(hào)帶寬。在數(shù)字通信中基帶信號(hào)是矩形脈沖,突變的上升沿和下降沿包含高頻分量豐富,其頻譜范圍普遍比較寬(頻譜是一個(gè)Sa函數(shù))。為了有效利用信道,在信號(hào)傳輸之前,需要對(duì)信號(hào)進(jìn)行頻譜壓縮。使其在消除碼間串?dāng)_和達(dá)到最佳檢測(cè)的前提下,大大提高頻帶利用率。信號(hào)帶寬匹配信道帶寬。
(2)改變傳輸信號(hào)的成形波形,可以減小抽樣定時(shí)脈沖誤差所帶來(lái)的影響,即降低了碼間干擾(ISI)。信號(hào)帶限就會(huì)引入碼間串?dāng)_(時(shí)域的離散化對(duì)應(yīng)頻域的周期化),會(huì)導(dǎo)致接收信號(hào)波形失真。但一般情況下,只需要在特定時(shí)刻的信號(hào)抽樣值無(wú)失真,并不需要整個(gè)信號(hào)波形都無(wú)失真,而升余弦濾波器剛好就能對(duì)基帶信號(hào)頻譜進(jìn)行帶限,并且不影響信號(hào)在特定時(shí)刻的抽值
原文鏈接:https://blog.csdn.net/weixin_46136963/article/details/107981923
我在研究成型濾波這部分知識(shí)的時(shí)候花了大量時(shí)間,我無(wú)法給出教材上那么詳細(xì)的資料,只能是按照我的個(gè)人理解和學(xué)習(xí)過(guò)程做簡(jiǎn)單總結(jié),想要進(jìn)一步學(xué)習(xí)的話,就得學(xué)習(xí)信號(hào)與系統(tǒng)與數(shù)字信號(hào)處理了。數(shù)字濾波器分為FIR(有限沖擊響應(yīng))和IIR(無(wú)限沖擊響應(yīng)),其中FIR無(wú)反饋模塊,IIR有反饋模塊,可想而知,F(xiàn)IR的輸出與之前的輸出無(wú)關(guān),IIR的輸出與之前的輸出是有關(guān)系的,還需要記住另一個(gè)結(jié)論,F(xiàn)IR具有線性相位。FIR濾波器具有很多結(jié)構(gòu),我畫了一種最簡(jiǎn)單的形式,如下圖。讀者可能會(huì)覺(jué)得手動(dòng)畫圖多此一舉,其實(shí)我畫圖是為了加深理解,我還自己手動(dòng)計(jì)算過(guò)濾波器的輸出^_^。
可以看出,這是一種延遲,相乘再相加的結(jié)構(gòu),實(shí)際上就是卷積和,其中x(n)是輸入的數(shù)字序列,y(n)是輸出的數(shù)字序列,a0-a10稱為濾波器的系數(shù),卷積的計(jì)算過(guò)程就是:換元、翻轉(zhuǎn)、移位、相乘求和,一邊卷動(dòng),一邊求和,很形象。為了驗(yàn)證這個(gè)想法,我們用Matlab設(shè)計(jì)一個(gè)升余弦濾波器,如下圖。
量化成16位
并保存量化后的系數(shù)-2529,0,4654,10179,14661,16384,14661,10179, 4654,0,-2529
假定輸入序列x(n)是[1,-1,-1,-1,-1,-1,-1,-1,1],可以算出濾波器的輸出
y(0)=a0*x(0) =-2529
y(1)=a0*x(1)+a1*x(0)=2529
y(2)=a0*x(2)+a1*x(1)+a2*x(0)=7183
y(3)=a0*x(3)+a1*x(2)+a2*x(1)+a3*x(0)=8054
y(4)=……=2357
y(5)=……=-10581
好,這是手動(dòng)計(jì)算的結(jié)果,我們?cè)賮?lái)看看Matlab函數(shù)的輸出結(jié)果,如下圖。
其中y1是卷積運(yùn)算的結(jié)果,y2是使用Matlab的filter函數(shù)濾波后的結(jié)果,可見,y2與y1的前幾個(gè)輸出值是完全匹配的。以上過(guò)程說(shuō)明數(shù)字濾波器的輸出的確就是輸入序列與濾波器系數(shù)卷積的結(jié)果。還有一個(gè)問(wèn)題,為什么把原始數(shù)字序列與濾波器系數(shù)卷積后,頻譜特性就改變了呢?我自己的理解是,當(dāng)前的輸出是之前的多個(gè)輸入值乘系數(shù)相加后的結(jié)果,可以起到對(duì)輸入信號(hào)進(jìn)行平滑處理,既然信號(hào)變得平滑了,信號(hào)突變也就沒(méi)那么厲害了,信號(hào)的頻率成分必定減少,頻譜自然被壓縮。從數(shù)學(xué)上看,數(shù)字濾波器的輸入與輸出可以表達(dá)為差分方程,這個(gè)差分方程的頻率響應(yīng)呈現(xiàn)出低通、高通、帶通等形式,奧本海姆的《信號(hào)與系統(tǒng)》寫得很好,感興趣的讀者可以看看。
(1) 首先生成20000個(gè)1 -1的隨機(jī)序列,并保存在rand_data.txt文件中,Matlab代碼如下:
clear;clc;
N=20000;
s=randi([0 1],N,1);
s1=2*s-1;
fid=fopen('D:Tempmatlab
and_data.txt','w');
fprintf(fid,'%d
',s1);fclose(fid);
(2) 生成一個(gè)128階,滾降系數(shù)是0.25的,歸一化截止頻率0.25的平方根升余弦滾降濾波器,并量化為16位整數(shù),保存為coe格式,供Vivado使用。Matlab代碼如下:
clear;clc;
span=32; %符號(hào)跨度
sps=4; %每個(gè)符號(hào)的點(diǎn)采樣數(shù)
%使用rcosdesign得到濾波器系數(shù)
h=rcosdesign(0.25, span, sps, 'sqrt');
%得到的系數(shù)通帶增益為6dB,暫不清楚原因,除2后正常
h2=h/2;
figure (1);
freqz(h2,1,1024);
%將系數(shù)放大并取整
coe_int=round((h/max(abs(h)))*(2^15-1));
freqz(coe_int,1,1024);
format long;
%將系數(shù)量化為15位小數(shù)
coe_frac=coe_int/2^15;
figure (2);
freqz(coe_frac,1,1024);
fid=fopen('D:Tempmatlabcoe_frac.coe','w');
fprintf(fid,'Radix = 10;
');
fprintf(fid,'CoefData =
');
fprintf(fid,'%16.15f,
',coe_frac);fprintf(fid,';');fclose(fid);
fid=fopen('D:Tempmatlabcoe_int.coe','w');
fprintf(fid,'Radix = 10;
');
fprintf(fid,'CoefData =
');
fprintf(fid,'%d,
',coe_int);fprintf(fid,';');fclose(fid);
fid=fopen('D:Tempmatlabcoe_int.txt','w');
fprintf(fid,'%d ',coe_int);fclose(fid);
頻率響應(yīng)如下圖
(3) 在Vivado中使用FIR IP核,加載coe_int.coe文件,并作如下配置
(4) 編寫testbench,讀入第(1)步生成的rand_data.txt,并將FIR濾波后的結(jié)果保存在filt_data.txt中,部分代碼如下
integer fid_in;
initial
begin
fid_in = $fopen("D:/Temp/matlab/rand_data.txt","r");
end
always@(posedge clk_1m)
begin
if(!rst)
begin
din <= 8'd0;
s_data_tvalid <= 1'b0;
end
else if(s_data_tready)
begin
$fscanf(fid_in,"%d",din);
s_data_tvalid <= 1'b1;
end
end
integer fid_out;
initial
begin
fid_out = $fopen("D:/Temp/matlab/filt_data.txt","w");
end
always@(posedge clk_4m)
begin
if(m_data_tvalid)
begin
$fwrite(fid_out,"%d
",dout);
end
end
(5) 配置Vivado使用Modelsim仿真并運(yùn)行,得到filt_data.txt。
(6) 使用對(duì)比f(wàn)ilt_data.txt與Matlab使用filter函數(shù)得到的結(jié)果是否一致,代碼如下
clear;clc;
ps=1*10^6; %碼速率為1MHz
Fs=4*10^6; %采樣速率為8MHz
N=2000; %仿真數(shù)據(jù)的長(zhǎng)度
coe_int=importdata('D:Tempmatlabcoe_int.txt');
s=importdata('D:Tempmatlab and_data.txt');
fir_out=importdata('D:Tempmatlabfilt_data.txt');
t=0:1/Fs:(N*Fs/ps-1)/Fs; %產(chǎn)生長(zhǎng)度為N,頻率為fs的時(shí)間序列
%截?cái)郌IR輸出的前8K數(shù)據(jù)
fir_out_8k_temp=fir_out(2:N*(Fs/ps)+1,1);
fir_out_8k=fir_out_8k_temp';
%以Fs頻率采樣
ups=upsample(s',Fs/ps);
%濾波
filt_mat=filter(coe_int,1,ups);
filt_mat_8k=filt_mat(1:8000);
%對(duì)比數(shù)據(jù)
isequal(fir_out_8k,filt_mat_8k)
對(duì)比結(jié)果如下
可見,F(xiàn)IR濾波器與Matlab filter函數(shù)的輸出結(jié)果完全一致。
下一篇: PLC、DCS、FCS三大控