脈沖型濾波器用成型脈沖即數字1用矩形脈沖表示用升余弦脈沖或高斯脈沖表示主要用於基帶數據處理。
在數字通信系統中,基帶信號進入調制器前,波形是矩形脈沖,突變的上升沿和下降沿包含高頻成分較豐富,信號的頻譜一般比較寬。從本質上說,脈沖成形就是一種濾波。數字通信系統的信號都必須在一定的頻帶內,但是基帶脈沖信號的頻譜是一個Sa函數,在頻帶上是無限寬的,單個符號的脈沖將會延伸到相鄰符號碼元內產生碼間串擾,這樣就會干擾到其他信號,這是不允許的。為了消除干擾,信號在發射之前要進行脈沖成形濾波,把信號的頻率約束在帶內。因此在信道帶寬有限的條件下,要降低誤碼率,提升信道頻帶利用率,需要在信號傳輸前,對其進行脈沖成形處理,改善其頻譜特,產生適合信道傳輸的波形。符號/秒代表單位波特(Baud),波特率是符號信息的比特率。一般的脈沖成型是要過采樣的,不然沒有意義,因為成型濾波會擴展帶寬,過采樣是為了減少頻譜混疊。
常用的脈沖成型濾波器有RC成型(升余弦)、Gaussian成型等。
Matlab作為一個強大的仿真工具,在通信信號處理中有着廣泛的應用。新版的Matlab(2014a)中關於濾波器設計,很多API都做了更新,下面個根據文檔仿真和對比幾個成型濾波器。
早些版本的firrcos函數用來設計升余弦濾波器的函數,現在已經更改成了rcosdesign函數。
例如:設計一個16階升余弦濾波器,載波頻率Fc = 1KHz,滾降系數0.25,采樣率為8KHz。
N = 16;
Fc = 1000;
R = 0.25;
Fs = 8000;
h = firrcos(N, Fc, R, Fs, 'rolloff', 'normal');
figure();plot(h)
下圖是濾波器的抽頭系數,階數為16共有17個抽頭。
如果用rcosdesign函數來設計這個濾波器,那么要用下面的調用方法來實現。
h1 = rcosdesign(R, N/(Fs/Fc/2), Fs/Fc/2,'normal');
h1 = h1 / max(h1) / (Fs/Fc/2); %重新量化一下系數
figure;plot(h1)
同樣進行繪圖,結果同上面的相同。
在Matlab工具箱中,涉及升余弦濾波器的函數有好幾個:rcosflt 使用升余弦濾波器對輸入信號進行濾波,rcosine設計升余弦濾波器,rcosiir 設計升余弦IIR濾波器,firrcos 升余弦濾波器設計。他們大部分已經慢慢被Matlab拋棄(新版本的Matlab將不贊成使用,但是會因為兼容性的歷史原因被保留)。
下面重點介紹一下 rcosdesign函數,這個函數數Matlab推薦的用來做升余弦成型濾波的函數。
[語法]
b = rcosdesign(beta,span,sps)
b = rcosdesign(beta,span,sps,shape)
[描述]
b = rcosdesign(beta,span,sps) 函數返回一個滾降系數為beta的均方根升余弦函數。函數被截斷為span個符號並且每個符號周期有sps個采樣點。濾波器的階數為 span*sps並且必須為偶數。濾波器的能量為1。
b = rcosdesign(beta,span,sps,shape)中,最后一個參數shape,當shape設置為'sqrt'時返回均方根升余弦濾波器系數,當shape被設置為'normal'時,返回一個升余弦濾波器的系數。
[例如]
設計一個滾降系數為0.25,符號截斷數為6,每符號采樣點為4的濾波器。
h = rcosdesign(0.25, 6, 4);
mx = max(abs(h - rcosdesign(0.25, 6, 4)));
fvtool(h,'Analysis','impluse');
下面的程序片段做了一個成型濾波的過程。
設計一個48階的升余弦FIR濾波器,滾降因子為0.5,發送速率為1被速率,過采樣率為8倍過采樣。
%% filter: order = 48, rolloff factor: alpha = 0.5, sps = 8
% b = firros(n,Fc,df,Fs) Fc:cutoff frequency,df: transmition bandwidth, Fs:oversampling frequency
h = firrcos(48, 0.5, 0.5, 8); %Fc = 1/2, h = rcosdesign(0.5, 6, 8);也可以
figure(1);
plot(h);
grid on;
xlabel('Time');
ylabel('Amplitude');
title(' raised cosine rolloff filter');
tx_bits1x = randint(100,1)*2 -1;
tx_bits8x = zeros(1,800);
tx_bits8x(1:8:end) = tx_bits1x;
tx_shaped = filter(h,1,tx_bits8x);
tx_sampled = tx_shaped(1:8:end);
figure(2);
stem(tx_bits1x(1:40));
title('orginal bitstream');
figure(3);
plot(tx_shaped(1:100));
title('output waveform');
grid on;
figure(4);
stem(tx_sampled(1:40));
grid on;
title('sampled output');
圖1:成型濾波器的系數
圖2:原始的數據比特流
圖3:經過濾波器后的波形
圖4:抽取之后的數據
rocsdesign是firrcos的替代,在新版的matlab中建議使用rcosdesign,具體請看MarthWorks的文檔。下面展示了它們之間的轉換方法。
N = 48; R = 0.5; beta = R; Fs = 8; Fc = 0.5; sps = Fs/(2*Fc); span = N/sps; b1 = firrcos(N,Fc,R,Fs,'rolloff','normal'); b1n = rcosdesign(beta, span, sps, 'normal'); b1n = b1n / max(b1n) /sps; figure; plot(b1) hold on plot(b1n, 'r-.') grid on legend('firrcos', 'rcosdesign'); max(abs(b1n-b1));