PC-CFR的原理是产生与峰值信号频谱相同的脉冲信号与原始信号的峰值对消,消除超过门限的峰值信号,以此来降低PARR。由于脉冲信号具有与原始信号频谱相同的特点,所以消峰后不会对邻道产生干扰。
已知条件:原始信号带宽。需要根据原始信号带宽产生相应的原型滤波器脉冲信号。
实现步骤:
1、根据设置的门限,找出超过门限的峰值信号位置。
2、根据峰值信号计算出每一个峰值的消峰因子:消峰因子a=(|x(t)|-rth)*e^(jph)) ) = (1-rth/|x(t)|)*|x(t)|*e^(jph)) = (1-rth/|x(t)|)*(I+jQ) 式中,消峰因子a,峰值信号下x(t),rth门限值,ph为峰值相位。
3、根据信号的带宽产生滤波器脉冲信号。
4、分配消峰脉冲产生器,一个脉冲产生器同一时刻只能消除一个脉冲。可设计多个脉冲产生器对多个峰值消除。
5、计算对消脉冲。对消脉冲是脉冲信号与消峰因子的乘积。
6、峰值对消。原始信号-对消脉冲。
消峰前后的对比如下图:
附matlab程序。
fs = 30.72*10^6;
th = 2*10^4;
win_len = 10;
FILTER_LEN = 127;
CPG_NUM = 6;
fd = 'din_data_q.txt';
T = load(fd);
dat_i = T;
fd = 'din_data_q.txt';
T = load(fd);
dat_q = T;
dat_iq = dat_i +1j*dat_q;
dat_len = length(dat_iq);
%峰值搜索
dat_amp = abs(dat_iq);
over_th = zeros(dat_len,1);
for i=1:dat_len
if(dat_amp(i)>th)
over_th(i) = dat_amp(i) -th;
else
over_th(i) = 0;
end
end
peaks = zeros(dat_len,1);
peaks_amp = zeros(dat_len,1);
peaks_th_amp = zeros(dat_len,1);
peaks_tmp = zeros(win_len,1);
i=1;
while i <= dat_len
if(over_th(i)>0)
peaks_tmp = dat_amp(i:i+win_len-1);
[peak,index] = max(peaks_tmp);
peaks(i+index-1) = dat_iq(i+index-1);
peaks_amp(i+index-1) = dat_amp(i+index-1);
peaks_th_amp(i+index-1) = over_th(i+index-1);
i = i + win_len;
else
i = i+1;
end
end
alfa = peaks_th_amp.*exp(1j*angle(peaks));
Hd = impuls_filter;
puls_para = (Hd.Numerator')./max(Hd.Numerator);
CPG_container = zeros(dat_len,CPG_NUM);
CPG_container = [alfa,alfa,alfa,alfa,alfa,alfa];
cpg_t = alfa;
for cpg_i=1:CPG_NUM
dat_i = 1;
while dat_i <= dat_len
if(CPG_container(dat_i,cpg_i) ~= 0)
CPG_container((dat_i-round(FILTER_LEN/2)+1):(dat_i+round(FILTER_LEN/2)-1),cpg_i) = alfa(dat_i).*puls_para;
for cpg_clr_i=1:CPG_NUM %已经分配好的cpg的位置清零
if(cpg_clr_i ~= cpg_i)
CPG_container(dat_i,cpg_clr_i) = 0;
end
end
dat_i = dat_i +FILTER_LEN; %两个峰值小于滤波器长度的,分配到下个cpg
else
dat_i = dat_i + 1;
end
end
end
CPG_container = CPG_container';
CPG_out = sum(CPG_container)';
cfr_out = dat_iq - CPG_out;