OCDM产生实数基带信号的四种方法
OCDM
OCDM于2016年提出,全称为:Orthogonal Chirp Division Multiplexing,由一组在时域或频域上重叠的Chirp组成,且每个Chirp相互正交,传输时不会互相干扰,在多径传播中具有更好的鲁棒性。OFDM信号易受多普勒频移的影响,子载波间的正交性被破坏,性能变差。OFDM-Chirp结合了OFDM的频带利用率高和Chirp信号对多普勒频移不敏感的优点。在通信方面,OFDM-Chirp信号解决了传统Chirp信号传输速率低的问题;在雷达目标探测方面,OFDM信号对多普勒频移敏感的问题。但Chirp信号扩频使得信号总带宽增加,从而占用了大量带宽资源。OCDM即是在OFDM-Chirp基础上提出的正交Chirp集的信号。
OCDM系统已用于光通信和水声通信[1-3]。声信号传播速率低,通信机运动问题使得水声信号存在明显的载波频率漂移(CFO),CFO使信号发生频率和相位的偏移,影响水声信号的恢复,降低通信质量。类似于OFDM中IFFT实现载波,OCDM通过逆菲涅尔变换(Inverse Discrete Fresnel Transform, IDFnT)实现子载波。DFnT矩阵形式为:
N取偶数,形式为:
DFT矩阵为:
因此,DFnT矩阵是的组合。其中:
OCDM系统基带结构图如下图所示。在发射端,输入数据串并转换后映射为通信符号,然后通过IDFnT矩阵得到OCDM符号。添加循环前缀,并串转换后传输至信道。在接收端,通过串并转换,去除CP,通过DFnT矩阵恢复通信信号,最后经过均衡、解映射和并串转换得到数据。
时域生成实数方法:
carrier_count=100;
symbols_per_carrier=2;
bits_per_symbol=4;
IFFT_bin_length=800;
PrefixRatio=1/4;
GI=PrefixRatio*IFFT_bin_length;
%同步序列
T = 1; %符号持续时间
fs = 1000;
t = (1:T*fs)/fs;
Kr = 100;
STF = cos(2*pi*100*t+pi*Kr*t.^2);
%bit流----QAM调制----并串转换
baseband_out_length=carrier_count*symbols_per_carrier*bits_per_symbol;
carriers=(1:carrier_count) + (floor(IFFT_bin_length/4) - floor(carrier_count/2))
conjugate_carriers=IFFT_bin_length - carriers + 2;
% baseband_out=round(rand(1,baseband_out_length));
baseband_out = ones(1,baseband_out_length);
complex_carrier_matrix=qam16(baseband_out);
complex_carrier_matrix=reshape(complex_carrier_matrix',carrier_count,symbols_per_carrier)';
figure(1);
subplot(2,2,1);stem(1:baseband_out_length,baseband_out);ylim([0,1]);xlabel('n');title('发送数据流');
subplot(2,2,2);plot(complex_carrier_matrix,'*r');axis([-4,4,-4,4]);title('16QAM调制后星座图');grid on;
%改进IDFnT矩阵
Phi_1 = zeros(IFFT_bin_length, IFFT_bin_length);
Phi_2 = zeros(IFFT_bin_length, IFFT_bin_length);
for m = 1:IFFT_bin_length
Phi_1(m,m) = exp(-1j*pi/4) * exp(1j * pi * m^2 / IFFT_bin_length);
Phi_2(m,m) = exp(1j* pi * m^2 / IFFT_bin_length);
end
IFFT_modulation=zeros(symbols_per_carrier,IFFT_bin_length);
IFFT_modulation(:,carriers)=complex_carrier_matrix;
% signal_after_idfnt = IFFT_modulation * conj(Phi_2);
% signal_after_idfnt = ifft(signal_after_idfnt,IFFT_bin_length,2);
% signal_after_idfnt = signal_after_idfnt * conj(Phi_1);
%Hermitian
F = exp(1j*2*pi/IFFT_bin_length*(1:IFFT_bin_length)'*(1:IFFT_bin_length));
tmp1H = F.*(conj(Phi_2) .* F .* conj(Phi_1)).*F';
tmp2H = tmp1H;
tmp2H(401:800,401:800) = conj(tmp1H(401:800,401:800));
PhiH = F' .* tmp2H .* F;
signal_after_idfnt_2 = IFFT_modulation * PhiH;
subplot(2,2,3);plot((0:IFFT_bin_length-1)/IFFT_bin_length*T,real(signal_after_idfnt_2(1,:)));
grid on;ylabel('Amplitude');xlabel('Time');title('一个符号,OCDM时域');
trainingSequence2 = signal_after_idfnt_2(1,:);
save('trainingSequence2.mat','trainingSequence2');
%添加循环前缀
time_wave_matrix = signal_after_idfnt_2;
time_wave_matrix_cp=zeros(symbols_per_carrier,IFFT_bin_length + GI );
for k=1:symbols_per_carrier
for i=1:IFFT_bin_length
time_wave_matrix_cp(k,i+GI)=time_wave_matrix(k,i);
end
for i=1:GI
time_wave_matrix_cp(k,i)=time_wave_matrix(k,i+IFFT_bin_length - GI);
end
end
%发送至物理信道
T_gap = 0.5;
Tx_data_OCDM=reshape(time_wave_matrix_cp',(symbols_per_carrier)*(IFFT_bin_length+GI) ,1)';
Tx_data = [zeros(1,T_gap*fs),STF,zeros(1,T_gap*fs),Tx_data_OCDM,zeros(1,T_gap*fs),STF];
subplot(2,2,4);plot((1:length(Tx_data))/fs,real(Tx_data));
grid on;ylabel('Amplitude (volts)');xlabel('Time/s');title('OCDM Time Signal')
%==============OCDM信号解调===========================
for i = 1:1000
Af = Tx_data(1,i:i+1000-1);
STF_xcor = xcorr(Af,STF);
end
figure;plot(abs(STF_xcor))
[~, ind] = find(STF_xcor == max(STF_xcor));
Rx_data_OCDM = Tx_data(ind+(1.5*fs):ind+(1.5*fs)+symbols_per_carrier*(IFFT_bin_length+GI)-1);
Rx_data_matrix = reshape(Rx_data_OCDM, IFFT_bin_length+GI,symbols_per_carrier).';
Rx_data_complex_matrix = Rx_data_matrix(:,GI + 1:GI + IFFT_bin_length);
改进DFnT
% Rx_tmp = Rx_data_complex_matrix * Phi_1;
% Rx_tmp = fft(Rx_tmp,IFFT_bin_length,2);
% Y1 = Rx_tmp*Phi_2;
tmp1 = F' .*(Phi_1 .* F' .* Phi_2).*F;
tmp2 = tmp1;
tmp2(401:800,401:800) = conj(tmp1(401:800,401:800));
Phi = F .* tmp2 .* F';
Y1 = Rx_data_complex_matrix * Phi;
%均衡
% load('trainingSequence.mat');
% Y_trainingSequence = Y1(1,:);
% junheng = trainingSequence./Y_trainingSequence;
% Y1 = Y1 .* junheng;
Rx_carriers = Y1(:,carriers);
%QAM解调
Rx_phase = angle(Rx_carriers); %计算接收信号的相位特性
Rx_mag = abs(Rx_carriers); %计算接收信号的幅度特性
[M,N] = pol2cart(Rx_phase,Rx_mag); %转换极坐标数据为直角坐标数据
Rx_complex_carrier_matrix = complex(M,N); %两个直角坐标的实数据为构成复数据
figure;plot(Rx_complex_carrier_matrix,'*r'); title('接收数据星座图');grid on;axis([-4,4,-4,4]);title('接收星座图');
%16QAM解调
Rx_serial_complex_symbols = reshape(Rx_complex_carrier_matrix',size(Rx_complex_carrier_matrix,1)*size(Rx_complex_carrier_matrix,2),1)';
%将矩阵Rx_complex_carrier_matrix转换为1的数组
Rx_decoded_binary_symbols = demoduqam16(Rx_serial_complex_symbols);
%进行16QAM解调
baseband_in = Rx_decoded_binary_symbols;
%将解调恢复的二进制信号存放在baseband_in
%误码率计算
bit_errors = find(baseband_in ~= baseband_out);
%解调恢复的二进制信号与发送二进制信号比较,查找误码
bit_error_count = size(bit_errors,2) %计算误码个数
ber = bit_error_count/baseband_out_length %计算误码率