當前位置: 首頁 > 工業電子產品 > 其他電子產品 > 開發板,套件,編程器 > 開發板
發布日期:2022-10-14 點擊率:41
成型濾波就是通過對數字基帶信號的處理把信號的頻譜壓縮在一定的帶寬內。先看一張圖,就是矩形脈沖信號的頻譜,這張圖是用別人的代碼畫出來的,比我的代碼畫的好,畢竟人家是專業的。
很明顯,如果不對這個頻譜做限制,那么它將會占用特別大的帶寬,在實際的無線通信產品中,根本沒有這種頻譜的產品。用比較專業的一點的方式描述,成型濾波有兩個作用:
(1)頻譜壓縮,限制信號帶寬。在數字通信中基帶信號是矩形脈沖,突變的上升沿和下降沿包含高頻分量豐富,其頻譜范圍普遍比較寬(頻譜是一個Sa函數)。為了有效利用信道,在信號傳輸之前,需要對信號進行頻譜壓縮。使其在消除碼間串擾和達到最佳檢測的前提下,大大提高頻帶利用率。信號帶寬匹配信道帶寬。
(2)改變傳輸信號的成形波形,可以減小抽樣定時脈沖誤差所帶來的影響,即降低了碼間干擾(ISI)。信號帶限就會引入碼間串擾(時域的離散化對應頻域的周期化),會導致接收信號波形失真。但一般情況下,只需要在特定時刻的信號抽樣值無失真,并不需要整個信號波形都無失真,而升余弦濾波器剛好就能對基帶信號頻譜進行帶限,并且不影響信號在特定時刻的抽值
原文鏈接:https://blog.csdn.net/weixin_46136963/article/details/107981923
我在研究成型濾波這部分知識的時候花了大量時間,我無法給出教材上那么詳細的資料,只能是按照我的個人理解和學習過程做簡單總結,想要進一步學習的話,就得學習信號與系統與數字信號處理了。數字濾波器分為FIR(有限沖擊響應)和IIR(無限沖擊響應),其中FIR無反饋模塊,IIR有反饋模塊,可想而知,FIR的輸出與之前的輸出無關,IIR的輸出與之前的輸出是有關系的,還需要記住另一個結論,FIR具有線性相位。FIR濾波器具有很多結構,我畫了一種最簡單的形式,如下圖。讀者可能會覺得手動畫圖多此一舉,其實我畫圖是為了加深理解,我還自己手動計算過濾波器的輸出^_^。
可以看出,這是一種延遲,相乘再相加的結構,實際上就是卷積和,其中x(n)是輸入的數字序列,y(n)是輸出的數字序列,a0-a10稱為濾波器的系數,卷積的計算過程就是:換元、翻轉、移位、相乘求和,一邊卷動,一邊求和,很形象。為了驗證這個想法,我們用Matlab設計一個升余弦濾波器,如下圖。
量化成16位
并保存量化后的系數-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
好,這是手動計算的結果,我們再來看看Matlab函數的輸出結果,如下圖。
其中y1是卷積運算的結果,y2是使用Matlab的filter函數濾波后的結果,可見,y2與y1的前幾個輸出值是完全匹配的。以上過程說明數字濾波器的輸出的確就是輸入序列與濾波器系數卷積的結果。還有一個問題,為什么把原始數字序列與濾波器系數卷積后,頻譜特性就改變了呢?我自己的理解是,當前的輸出是之前的多個輸入值乘系數相加后的結果,可以起到對輸入信號進行平滑處理,既然信號變得平滑了,信號突變也就沒那么厲害了,信號的頻率成分必定減少,頻譜自然被壓縮。從數學上看,數字濾波器的輸入與輸出可以表達為差分方程,這個差分方程的頻率響應呈現出低通、高通、帶通等形式,奧本海姆的《信號與系統》寫得很好,感興趣的讀者可以看看。
(1) 首先生成20000個1 -1的隨機序列,并保存在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) 生成一個128階,滾降系數是0.25的,歸一化截止頻率0.25的平方根升余弦滾降濾波器,并量化為16位整數,保存為coe格式,供Vivado使用。Matlab代碼如下:
clear;clc;
span=32; %符號跨度
sps=4; %每個符號的點采樣數
%使用rcosdesign得到濾波器系數
h=rcosdesign(0.25, span, sps, 'sqrt');
%得到的系數通帶增益為6dB,暫不清楚原因,除2后正常
h2=h/2;
figure (1);
freqz(h2,1,1024);
%將系數放大并取整
coe_int=round((h/max(abs(h)))*(2^15-1));
freqz(coe_int,1,1024);
format long;
%將系數量化為15位小數
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);
頻率響應如下圖
(3) 在Vivado中使用FIR IP核,加載coe_int.coe文件,并作如下配置
(4) 編寫testbench,讀入第(1)步生成的rand_data.txt,并將FIR濾波后的結果保存在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仿真并運行,得到filt_data.txt。
(6) 使用對比filt_data.txt與Matlab使用filter函數得到的結果是否一致,代碼如下
clear;clc;
ps=1*10^6; %碼速率為1MHz
Fs=4*10^6; %采樣速率為8MHz
N=2000; %仿真數據的長度
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; %產生長度為N,頻率為fs的時間序列
%截斷FIR輸出的前8K數據
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);
%對比數據
isequal(fir_out_8k,filt_mat_8k)
對比結果如下
可見,FIR濾波器與Matlab filter函數的輸出結果完全一致。
下一篇: PLC、DCS、FCS三大控
上一篇: AD9361軟件無線電實驗