OFDM的DFT中的块和N-by-N问题

信息处理 matlab OFDM
2022-02-18 03:25:05

我正在尝试研究和理解 OFDM,在 MATLAB 中编码 OFDM 时,我遇到了这个问题:

假设我们有 Numsymbol = 256 和 dataqpsk 我们使用的数据,我面临的问题是,当我逐块执行 iFFT 时,这似乎没问题,但是当试图使其 N-by-N .. 这给出了一个问题。

这是步骤。现在我将按块制作 iFFT:

clear all; clc; 

N_carrier = 256;  % number of carrier
N_symbol = 256;  %number of symbols
N_FFT = 256;  %length of FFT
N = N_carrier;
L_cp = N/4;   % the CP 

dataqpsk = rand(N_carrier,N_symbol);  %Example for modulated data
size(dataqpsk); 
for isij=1: N_symbol
    % input modulated data
    dataqpsk1=dataqpsk(:,isij);     
    size(dataqpsk1)
    D_map = dataqpsk1;

    %% doing such mapping 
    D_IFFT_fore=zeros(N_FFT,1);
    D_IFFT_fore(1:(N/2)) = [D_map(((N/2)+1):N)];
    D_IFFT_fore((N_FFT-((N/2)-1)):N_FFT) = [D_map(1:(N/2))];
    D_IFFT_aft=N_FFT.*ifft(D_IFFT_fore,N_FFT);%×÷ifft

    %add GI and interpolation.
    D_cp=[D_IFFT_aft(N_FFT-L_cp+1:N_FFT);D_IFFT_aft];
end 

但是现在当我尝试将其设置为 DFT N-by_N 时,我没有得到,如下所示:

clear all; clc; 

N_carrier = 256;  % number of carrier
N_symbol = 256;  %number of symbols
N_FFT = 256;
N = N_carrier;
L_cp = N/4;  %CP

dataqpsk = rand(N_carrier,N_symbol);
size(dataqpsk); 
D_map = dataqpsk; 
D_IFFT_fore=zeros(N_FFT,N_FFT);
D_IFFT_fore(1:(N/2)) = [D_map(((N/2)+1):N)];
D_IFFT_fore((N_FFT-((N/2)-1)):N_FFT) = [D_map(1:(N/2))];
D_IFFT_aft = N_FFT.*ifft(D_IFFT_fore,N_FFT); % ifft
D_cp(1:L_cp,1:N_FFT)=D_IFFT_aft(N_FFT-L_cp+1:N_FFT,1:N_FFT);

问题是当尝试获得 DFT N-by_N 的结果时,我从 D_IFFT_fore(1:(N/2)) = [D_map(((N/2)+1):N)]; 的步骤中得到。零矩阵!

请问,有什么帮助吗?

谢谢你


谢谢亲爱的msm,这是完整的代码:

clear all; clc; 

N_carrier = 256;  % number of carrier
N_symbol = 256;  %number of symbols
N_FFT = 256;
N = N_carrier;
L_cp = N/4;  %CP

dataqpsk = rand(N_carrier,N_symbol);
size(dataqpsk); 
D_map = dataqpsk; 
D_IFFT_fore=zeros(N_FFT,N_FFT);
D_IFFT_fore(1:(N/2),:) = [D_map(((N/2)+1):N,:)];
D_IFFT_fore((N_FFT-((N/2)-1)):N_FFT,:) = [D_map(1:(N/2),:)];
D_IFFT_aft = N_FFT.*ifft(D_IFFT_fore,N_FFT); % ifft
D_cp(1:L_cp,1:N_FFT)=D_IFFT_aft(N_FFT-L_cp+1:N_FFT,1:N_FFT);

再次感谢

1个回答

尝试使用类似下面的东西。您希望以这种方式为所有列映射行,因此冒号表示所有列。仔细检查你是否从这些中得到了你想要的。我没有运行它来验证它是否提供了你想要的东西,但我相信它应该完全填充所有列。

D_IFFT_fore(1:(N/2),:) = D_map(((N/2)+1):N,:);

D_IFFT_fore((N_FFT-((N/2)-1)):N_FFT,:) = D_map(1:(N/2),:);