OFDM接收端子载波信号反向加载了
发射的是QPSK信号,经过IFFT,调制和解调,Tx端的信号在Rx端用matlabFFT之后反向了。
意思是这样的:假设发射的nFFT=8的信号某个symbol是 [0,a,b,0,0,0,c,d];
a,b,c,d∈(-1+i,-1-i,1+i,1-i);
那么接收端变成了 [0,f(d),f(c),0,0,0,f(b),f(a)]。d,c,b,a按照原来的相反的顺序循环加载了。
当然并不是原样加载上去,而是实部虚部反号且交换了,f是个函数,f(x)=-imag(x)-1i*real(x)。
非常奇怪,对吧?但是我不知道是怎么回事。
并且这个现象很奇怪,有时候出现,有时候不出现。有哪位知道原因么?请告知,感激不尽。
如果方便的话,把程序贴上来
光描述现象,不好分析问题
我的信号不是仿真,而是经过了实际的传输系统,所以不知道问题是不是在信号产生和接收处理中。
而且程序写得很糟糕,其中好多是很废柴的信号排列,因为要实现时序上的一些关系。贴出精简的部分吧。献丑了...
每个symbol内的data sample分成了六块,每块的数量是sextant=nFFT/6。正频和负频分别加载三个块,在正频和负频的各自三个块中各有两个pilot tone用于做相位估计。
nFFT=128.
CP 是cyclic prefix,0.125,也就是nFFT*0.125=128*0.125=16.
这是时序信号发生部分:
nFFT=128;
CP=0.125;
sextant=nFFT/6;
randombit=prbs17block(1:nSubcarriers*nSymbolspercircle,:); %read frequency data from the prbs data.
txfreqdataAline=randombit(:,1)+1i*randombit(:,2); %QPSK modulation
txfreqdataA=reshape(txfreqdataAline,nSubcarriers,nSymbolspercircle); %chunking
frame=txfreqdataA;
%OFDM modulation
X=zeros(nFFT,nSymbolspercircle);
X(2:sextant+1,:)=frame(1:sextant,:);
X(sextant+2,:)=2;
X(sextant+3:2*sextant+2,:)=frame(sextant+1:2*sextant,:);
X(2*sextant+3,:)=0;
X(2*sextant+4:3*sextant+3,:)=frame(2*sextant+1:3*sextant,:);
X(nFFT-3*sextant-1:nFFT-2*sextant-2,:)=frame(3*sextant+1:4*sextant,:);
X(nFFT-2*sextant-1,:)=-2;
X(nFFT-2*sextant:nFFT-sextant-1,:)=frame(4*sextant+1:5*sextant,:);
X(nFFT-sextant,:)=0;
X(nFFT-sextant+1:nFFT,:)=frame(5*sextant+1:6*sextant,:);
x=sqrt(nFFT)*ifft(X,nFFT);
xwithcp=[x;x(1:CP*nFFT,:)];
tx=reshape(xwithcp,size(xwithcp,1)*size(xwithcp,2),1); %Serialization
信号接收和解调部分的主要程序:
[b]rxtimedataraw=reshape(rxtimedataraw,nFFT*(1+CP),length(Rx)/(nFFT*(1+CP))); %deserialization[/b]
[b]rxtimedata=rxtimedataraw(precut+1:precut+nFFT,1:length(Rx)/(nFFT*(1+CP))); %CP cut[/b]
[b]rxfreqdata_nFFT=fft(rxtimedata,nFFT);[/b]
[b]rxfreqdata_nSubcarriers=[rxfreqdata_nFFT(2:sextant+1,:);[/b]
[b]rxfreqdata_nFFT(sextant+3:2*sextant+2,:);[/b]
[b]rxfreqdata_nFFT(2*sextant+4:3*sextant+3,:);[/b]
[b]rxfreqdata_nFFT(nFFT-3*sextant-1:nFFT-2*sextant-2,:);[/b]
[b]rxfreqdata_nFFT(nFFT-2*sextant:nFFT-sextant-1,:);[/b]
[b]rxfreqdata_nFFT(nFFT-sextant+1:nFFT,:)];[/b]
[b]rxfreqdata_pilots=[rxfreqdata_nFFT(sextant+2,:);[/b]
[b]rxfreqdata_nFFT(2*sextant+3,:);[/b]
[b]rxfreqdata_nFFT(nFFT-2*sextant-1,:);[/b]
[b]rxfreqdata_nFFT(nFFT-sextant,:)];[/b]
[b]没有问过有关程序的问题,所以不知道提供些什么好。如果有什么纰漏和未竟提供的,请指教。[/b]
[b]谢谢![/b]
请教不敢当,共同讨论学习吧
你所帖的数据定义这块应该是按要求写的
这里面涉及矩阵变形的语句
txfreqdataA=reshape(txfreqdataAline,nSubcarriers,nSymbolspercircle); %chunking
tx=reshape(xwithcp,size(xwithcp,1)*size(xwithcp,2),1); %Serialization
rxtimedataraw=reshape(rxtimedataraw,nFFT*(1+CP),length(Rx)/(nFFT*(1+CP))); %deserialization
可能和你描述的时域序列翻转问题相关,但是具体我也说不上来,只是感觉
信号经过的实时系统,由于是非程序可控所以不好判定
好的,我再研究研究。
谢谢!
会不会是载波同步,解调时候出现的倒π现象?具体原理不知道OFDM会不会出现
不好意思,刚刚看到回复。我现在去看看这种可能性。
BTW,如果是倒pi现象,应该怎么解决?除了采取差分编码,还有别的解决办法吗?
我也是凭着感觉说的,书上学的解决的方法就是差分搞定的。:)