設計升余弦濾波器以及方均根升余弦濾波器——comm.RaisedCosineTransmitFilter用法及其替代


設計升余弦濾波器以及方均根版升余弦濾波器並且使用
在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文檔


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM