升余弦滤波器常常作为发送端的成型滤波器,用来抑制信号带外辐射。
在maltab中,主要用rcosdesign函数来实现FIR脉冲成型滤波器,其他相关的函数还有comm.RaisedCosineTransmitFilter,comm.RaisedCosineTransmitFilter。
b = rcosdesign(beta,span,sps)
b = rcosdesign(beta,span,sps,shape)
b = rcosdesign(beta,span,sps)返回系数b,对应于一个滚降系数为beta的均方根升余弦FIR滤波器。滤波器截断为span个symbols,每个symbol包含sps个采样点。滤波器的阶数sps*span必须是偶数。滤波器能量为1。
b = rcosdesign(beta,span,sps,shape)返回一个均方根升余弦滤波器(shape为'sqrt')或者一个升余弦滤波器(shape为'normal')。
升余弦可以抑制码间干扰,发送和接收滤波器分开。
升余弦滤波器的主要参数是其滚降系数,滚降系数直接决定了滤波器的带宽。理想的升余弦滤波器由无限多个抽头。因此,实际上的升余弦滤波器是加窗的。窗的长度由FilterSpanInSymbols特性来控制。在本例中,我们将窗长度设定为6个symbol长度。这样的滤波器也有3个symbol的群延时。升余弦滤波器用在信号上采样后的脉冲成型。因此,我们也需要指定上采样倍数。升余弦滤波器的参数如下:
Nsym=6;
beta=0.5;
samsPerSym=8;
用升余弦发射滤波器系统结构体构建滤波器并用fvtool来可视化滤波器特性。
rctFilt = comm.RaisedCosineTransmitFilter(...
'Shape', 'Normal', ...
'RolloffFactor', beta, ...
'FilterSpanInSymbols', Nsym, ...
'OutputSamplesPerSymbol', sampsPerSym)
% Visualize the impulse response
fvtool(rctFilt, 'Analysis', 'impulse')
这个结构体设计了一个直接型多项式单位能量FIR滤波器。滤波器阶数Nsym*sampsPerSym,抽头数Nsym*sampsPerSym+1。可以利用gain特性归一化滤波器系数以使滤波后的和未滤波数据匹配。
% Normalize to obtain maximum filter tap value of 1
b = coeffs(rctFilt);
rctFilt.Gain = 1/max(b.Numerator);
% Visualize the impulse response
fvtool(rctFilt, 'Analysis', 'impulse')
升余弦滤波器的时域脉冲响应表示
由于8倍过采样,在符号采样点0处为最大值,在其他nTs处其采样值为0。
升余弦滤波器的群延时是恒定值,因为脉冲响应是对称的。其群延时大小是其初始时间和峰值响应时间之差,如下图:
我们产生一个双极性数据序列,然后在不引入ISI情况下用升余弦滤波器进行波形成型。
DataL = 20; % Data length in symbols
R = 1000; % Data rate
Fs = R * sampsPerSym; % Sampling frequency
% Create a local random stream to be used by random number generators for
% repeatability
hStr = RandStream('mt19937ar', 'Seed', 0);
% Generate random data
x = 2*randi(hStr, [0 1], DataL, 1)-1;
% Time vector sampled at symbol rate in milliseconds
tx = 1000 * (0: DataL - 1) / R;
下图画出了源数据和插值后的信号。很难比较这两个信号由于滤波器峰值响应由滤波器群延时Nsym/(2*R)延后了。需要指出的是,我们在输入X后添加Nsym/2个0以使滤波器有用采样点都输出。
% Filter
yo = rctFilt([x; zeros(Nsym/2,1)]);
% Time vector sampled at sampling frequency in milliseconds
to = 1000 * (0: (DataL+Nsym/2)*sampsPerSym - 1) / Fs;
% Plot data
fig1 = figure;
stem(tx, x, 'kx'); hold on;
% Plot filtered data
plot(to, yo, 'b-'); hold off;
% Set axes and labels
axis([0 30 -1.7 1.7]); xlabel('Time (ms)'); ylabel('Amplitude');
legend('Transmitted Data', 'Upsampled Data', 'Location', 'southeast')
接下来步骤通过延后输入信号对升余弦滤波器群延时进行了补偿。现在容易看出升余弦滤波器如何上采样和对信号滤波。
% Filter group delay, since raised cosine filter is linear phase and
% symmetric.
fltDelay = Nsym / (2*R);
% Correct for propagation delay by removing filter transients
yo = yo(fltDelay*Fs+1:end);
to = 1000 * (0: DataL*sampsPerSym - 1) / Fs;
% Plot data.
stem(tx, x, 'kx'); hold on;
% Plot filtered data.
plot(to, yo, 'b-'); hold off;
% Set axes and labels.
axis([0 25 -1.7 1.7]); xlabel('Time (ms)'); ylabel('Amplitude');
legend('Transmitted Data', 'Upsampled Data', 'Location', 'southeast')
这个步骤给出了改变滚降系数(0.5-->0.2)带来的效果。滚降系数变小使滤波器有更窄的变化带导致滤波后信号过冲变大。
滚降系数表示超出理论奈奎斯特带宽那部分带宽,当滚降系数为0则变成了理想矩形,滚降系数为1则为占用两倍奈奎斯特带宽的升余弦滤波器。
% Set roll-off factor to 0.2
rctFilt2 = comm.RaisedCosineTransmitFilter(...
'Shape', 'Normal', ...
'RolloffFactor', 0.2, ...
'FilterSpanInSymbols', Nsym, ...
'OutputSamplesPerSymbol', sampsPerSym);
% Normalize filter
b = coeffs(rctFilt2);
rctFilt2.Gain = 1/max(b.Numerator);
% Filter
yo1 = rctFilt2([x; zeros(Nsym/2,1)]);
% Correct for propagation delay by removing filter transients
yo1 = yo1(fltDelay*Fs+1:end);
% Plot data
stem(tx, x, 'kx'); hold on;
% Plot filtered data
plot(to, yo, 'b-',to, yo1, 'r-'); hold off;
% Set axes and labels
axis([0 25 -2 2]); xlabel('Time (ms)'); ylabel('Amplitude');
legend('Transmitted Data', 'beta = 0.5', 'beta = 0.2',...
'Location', 'southeast')
升余弦滤波器的典型应用是将滤波器分为发送和接收。发送端和接收端都使用根升余弦滤波器。发送和接收滤波器结合起来等效于升余弦滤波器导致了可忽略不计的ISI。
% Design raised cosine filter with given order in symbols
rctFilt3 = comm.RaisedCosineTransmitFilter(...
'Shape', 'Square root', ...
'RolloffFactor', beta, ...
'FilterSpanInSymbols', Nsym, ...
'OutputSamplesPerSymbol', sampsPerSym);
数据流升采样然后在发送端用根升余弦滤波器滤波。
% Upsample and filter.
yc = rctFilt3([x; zeros(Nsym/2,1)]);
% Correct for propagation delay by removing filter transients
yc = yc(fltDelay*Fs+1:end);
% Plot data.
stem(tx, x, 'kx'); hold on;
% Plot filtered data.
plot(to, yc, 'm-'); hold off;
% Set axes and labels.
axis([0 25 -1.7 1.7]); xlabel('Time (ms)'); ylabel('Amplitude');
legend('Transmitted Data', 'Sqrt. Raised Cosine', 'Location', 'southeast')
发送信号然后再接收端经过滤波。单位能量归一化保证发送接收等效滤波器和单位能量归一化升余弦滤波器相同。滤波接收信号等效于信号直接经过一个单独的升余弦滤波器。
% Design and normalize filter.
rcrFilt = comm.RaisedCosineReceiveFilter(...
'Shape', 'Square root', ...
'RolloffFactor', beta, ...
'FilterSpanInSymbols', Nsym, ...
'InputSamplesPerSymbol', sampsPerSym, ...
'DecimationFactor', 1);
% Filter at the receiver.
yr = rcrFilt([yc; zeros(Nsym*sampsPerSym/2, 1)]);
% Correct for propagation delay by removing filter transients
yr = yr(fltDelay*Fs+1:end);
% Plot data.
stem(tx, x, 'kx'); hold on;
% Plot filtered data.
plot(to, yr, 'b-',to, yo, 'm:'); hold off;
% Set axes and labels.
axis([0 25 -1.7 1.7]); xlabel('Time (ms)'); ylabel('Amplitude');
legend('Transmitted Data', 'Rcv Filter Output',...
'Raised Cosine Filter Output', 'Location', 'southeast')