仿真ADC那里写了过采样的原理: 利用实信号的傅里叶变换是共轭对称, 反之:共轭对称的复信号做反傅里叶变换是实信号这个性质;
所以基本过程如下:
这样子获取的OFDM信号就是实信号了!!
代码如下(没抓虫,可能有bug,当伪代码先写着):
#include "const.h"
#include "complex.h"
//Complex modulated_signal[POINT_N], transmitted_signal[OFDM_N];
//POINT_N代表OFDM的subcarriers中,携带data的subcarriers的数量; OFDM_N代表所有subcarriers数量
//用过采样原理对调制信号在频域上做IFFT,获得高频的OFDM信号
void OFDM_GI (Complex (*modulated_signal), *transmitted_signal)
{
double OFDM_signal[1024];
Complex FFT_signal[1024];//1024个subcarriers(FFT信号),其中64*2个会搭载data
//初始化
for(int i=0; i<1024; i++){
FFT_signal[i]=0;
}
overSampling(modulated_signal, OFDM_signal);
addGI(OFDM_signal, transmitted_signal);
}
void overSampling (Complex (*modulated_signal), Complex (*OFDM_signal))
{
Complex conjugate_signal[POINT_N];
// obtain conjugate(s)
for (int j = 0; j < POINT_N; j++)
{
conjugate_signal[j].real = modulated_signal[j].real;
conjugate_signal[j].image = -modulated_signal[j].image;
}
// overSampling
for (int k = 0; k < POINT_N; k++)
{
FFT_signal[k+100] = modulated_signal[k];
FFT_signal[-k+100] = conjugate_signal[k];
}
// IFFT
for (int k = 0; k < POINT_N; k++)
{
for (int n = 0; n < 1024; n++)
{
current_signal[k].real = 1 / sqrt(1024) * ComplexMulti(FFT_signal[n], Exp(2 * PI * k * n / 1024)).real;
current_signal[k].image = 1 / sqrt(1024) * ComplexMulti(FFT_signal[n], Exp(2 * PI * k * n / 1024)).image;
OFDM_signal[k].real = OFDM_signal[k].real + current_signal[k].real;
OFDM_signal[k].image = OFDM_signal[k].image + current_signal[k].image;
}
}
}
void addGI(*OFDM_signal, *transmitted_signal)
{
int n;
for (n = 0; n < GI; n++)
{
transmitted_signal[n] = OFDM_signal[n + GI*3];
}
for (n = GI; n < OFDM_N; n++)
{
transmitted_signal[n] = OFDM_signal[n - GI];
}
}