設計升余弦濾波器以及方均根版升余弦濾波器並且使用
在matlab中有很多種寫法,下面我將展示這些。
缺省
缺省
comm.RaisedCosineTransmitFilter with properties:
Shape: 'Square root'
RolloffFactor: 0.2000
FilterSpanInSymbols: 10
OutputSamplesPerSymbol: 8
Gain: 1
b = rcosdesign(beta,span,sps)
b = rcosdesign(beta,span,sps,shape)
至少提供前三個參數,beta是滾降系數,sps是樣本每符號,sps*span+1是設計出的FIR濾波器長度,shape缺省是'sqrt'
多種方法
rcosdesign設計個濾波器,之后upsample,conv,upfirdn,filter之類的來處理(本質是:上采樣,線性卷積,下采樣,怎么寫是你的事情)
comm.RaisedCosineTransmitFilter得到函數句柄(一個函數對象),之后使用這個函數就行了
rcosflt
clear all;
close all;
clc;
nSym = 2048; % Number of input symbols
sps = 4; % Samples per symbol
nSamp = nSym*sps; % Number of samples
mOrder = 4; % mOrder psk
data = randi([0 mOrder-1],nSym,1);
modData = pskmod(data,mOrder,pi/mOrder);
%%%%%%%%%%%方法一
h=rcosdesign(0.2,8,sps,'sqrt');
%上采樣倍數建議選擇為濾波器的OutputSamplesPerSymbol,即這里的sps。可以理解成,一個是聲明濾波器時使用的參數,一個是應用濾波器時指定的參數,應保持一致。
%即,建議下面的OutputSamplesPerSymbol選擇為濾波器設計那里的sps
txSig=upfirdn(modData,h,sps);
txSig=txSig(1:end-length(h)+sps);
scatterplot(txSig)
%%%%%%%%%%%方法二
txfilter = comm.RaisedCosineTransmitFilter(...
'RolloffFactor',0.2, ...
'FilterSpanInSymbols',8, ...
'OutputSamplesPerSymbol',sps);
%ans=coeffs(txfilter);
%fvtool(ans.Numerator,'Analysis','impulse');
txSig1 = txfilter(modData);
scatterplot(txSig1)
%%%%%%%%%%%方法三
%rcosflt function: rcosdesign function and either filter or upfirdn functions
%請讀者自行補充吧
ans=0;
for i=1:length(txSig)
if abs(txSig(i)-abs(txSig1(i)))<1e-10
ans=ans+1
else
display(txSig(i));
display(txSig1(i));
end
end
ans
結論
txSig和txSig1可以說是一模一樣
背景知識補充
upfirdn函數介紹
upfirdn函數的介紹是說,上采樣,過FIR濾波器,下采樣。數學上就是說:每兩個數間補【升采樣倍數-1】個零,之后和h線性卷積,之后每【降采樣倍數】個數取第一個數出來。
upfirdn函數的一些例子是
輸入信號,濾波器,升采樣倍數,降采樣倍數
>> upfirdn([1,2],[3,4],1) 3 10 8
>> upfirdn([1,2],[3,4],2) 3 4 6 8
>> upfirdn([1,2],[3,4,5],2,1) 3 4 11 8 10
>> upfirdn([1,2],[3,4,5],2,3) 3 8
upfirdn(xn,hn,length) 作用為把xn中的每個值乘以序列hn,然后移位相加,length表示了移位的長度。其中xn、hn的點數分別為N1、N2,輸出點數為 N2+(N1-1)×length
這樣過后最后輸出的點數是N2+(N1-1)×length ,所以最后還需要截斷一下使得點變成N1×length
補充:啥是成型濾波器?
成型濾波器 是在發送端將信號經過成形濾波器進行帶限,使信號帶寬匹配信道帶寬。
(如果沒有成型濾波。時域上0、1信號是矩形信號,頻域得無限寬才能傳輸,沒有這樣的信道;而信號帶限就會引入碼間串擾,會導致接收信號波形失真。所以成型濾波)
參考
https://blog.csdn.net/weixin_44884357/article/details/89488374 一文理解matlab的成型濾波器設計
http://matrix.etseq.urv.es/manuals/matlab/toolbox/comm/rcosflt.html rcosflt文檔