第一次在这里发帖,试图让它尽可能好。不知道如何使 Python 代码看起来不错 - 有什么技巧吗?:) Anywho - 主要问题:
我目前正在从 SC-FDM(A) 调制器开始模拟 LTE 的上行链路。现在,“第一版”是用 Python 实现的 OFDM 调制器,基本上:
import numpy as np
import numpy.fft as npf
numSymbols = 12*10 # 10 resource blocks, each containing 12 subcarriers. FFTsize = 1024
tmp1 = np.array(np.random.randint(0,2,numSymbols))*2-1 tmp2 = np.array(np.random.randint(0,2,numSymbols))*2-1
inputSymbols = (np.array(tmp1) + 1j*np.array(tmp2))/np.sqrt(2) # QPSK modulation
TxSamples = npf.ifft(inputSymbols,FFTsize) # Zero-padded IFFT.
TxSamples 是一些随机二进制输入的 OFDM 调制信号。由于补零,子载波映射在 IFFT 中是隐含的。
我的问题是 LTE 上行链路使用与 DC 相关的半个子载波偏移。我的实现是建立在 IFFT 中的每个条目的间隔为 15kHz(根据 LTE 所需的子载波间隔)的假设之上的,这也是我在此处和此处找到的其他两个实现的情况。
那么,这个半副载波偏移(7.5kHz)如何与仿真结合呢?
如果您需要更多信息,请告诉我 - 真的不知道关于我的问题的信息是多还是少。
提前致谢。
** 更新: **
因此,我尝试通过在样本之间简单地添加一个零来进行频率过采样。这导致我在时域中有一个副本。切掉这个复制品让我回到了起点。
我为了解决这个问题所做的基本上是数学驱动的。从 DFT 的公式可以得出,您可以简单地将输入符号乘以复指数。这将改变频率。Python代码基本上是(覆盖上面示例中的最后一行):
ism = []
for m in range(len(inputSymbols)):
ism += [inputSymbols[m]*np.exp(1j*np.pi*m/FFTsize)]
TxSamples = npf.ifft(ism,FFTsize)
这产生了正确的时域表示,没有明确的过采样。验证 scipy 可以用作:
import scipy.signal as sps
import pylab as pl
ts1 = sps.resample(TxSamples,len(TxSamples)*2)
pl.figure(1)
pl.plot(10*np.log10(abs(npf.fft(ts1))))
这应该表明信号现在已经过采样了两次,并且频率仓的位置正确,而时域表示没有被破坏。
我想这样可以确保两个域是“相同的”。因为通过简单地在频域中进行过采样,不可能正确地表示时域信号。我不知道 - 这个“被黑”的解决方案似乎有效。但是,总是欢迎善意的更正。