C语言仿真ADC(从发送信号开始)-笔记
文章目录
基础:
傅里叶变换(知乎大佬们讲的真好啊):
基于以上的理论知识,大体的仿真过程如下:
- 从0101010序列-----
- 到QPSK调制后的N个subcarriers,此时为等效低通信号----
- 加载到中高频上成为IF信号----
- 接着把这组IF信号拿来过信道,信道可以有fading,有awg高斯白噪音等等, 不过实验的最后再加这些负面影响,开始先不考虑噪音比较好验证结果----
- 接下来进入接收端, 有很多方法, 未来仿真三种-perfect ADC/ 或者delta-sigma ADC/ 或者ZF-TDC; 先用delta-sigma ADC开始;
难点分析:
- 从step2到step3, 如何把等效低通信号加载到高频并获得IF信号
- 三种接收端的设计(这里主要写ADC了,TDC已经完成)
- 最后考虑信道的设计
接下来的研究就基于这些难点逐个击破就行了.
难点1: 如何把等效低通信号加载到高频并获得IF信号的实部
有两种方法:
方法1: 时域转换
参考<<数字通信>>, 直接将等效低通乘以一个高频复信号e^(jθ)即可, 注意乘以单一余弦是不行的, 详见上面参考文档虚数的意义.
这种方法其实是在时域上做的转换, 用t的表达式相乘.
而且这样没做IFFT, 获得的IF信号是复数.
方法2: 过采样实现频域转换
考虑到我们系统基于OFDM, 所以利用OFDM的过采样, 在频域上加载到高频, 整个过程要巧妙很多, 发送时就是实信号, 不用再分两路处理[1].
实现步骤另写一个文档记录: OFDM过采样获得中频IF信号
备注[1]: 什么情况下用OFDM发送IF信号可以只考虑实部?
<<Digital Communications, 5th edition>>第19页有证明, 实信号—傅里叶变化后是共轭对称的, 这俩是充分必要条件, 所以如果在IFFT之前, 序列被共轭对称之后, IFFT之后的序列就是实序列了. 那么只发送实部序列就可以了.
另外一种方法是IFFT之前, 序列没有经过共轭对称处理, 直接进行IFFT变换, 这样出来的就是复序列, 理论上是要分I,Q两路发送(处理)的, 因为现实世界只能发送实信号.
所以把"获取OFDM实信号"跟"过采样加载到高频"整合, 这一个难点详细来说就是为了产生纯实数的 中高频 OFDM 信号,要仿真以下步骤:
1.从信息数据中取 N 个复数用以定义正频率部分 (0~fm),这里就是QPSK_signal[N];
2. 再拼接它们的共轭对称以定义负频率部分 (-fm~0),这里就是获的QPSK_signal的共轭对称序列: QPSK_conju[64]
3. 插零点, 比如x[i+100] = s[i]
4. 然后做 IFFT,得到 2N 点的实数信号,其频率范围是 (-fm, fm)。
如何理解OFDM中的子载波, IFFT, FFT?
上面假设OFDM的FFT序列为序列x, 也就是说, 一个OFDM symbol包含x.length个子载波, 但是这个子载波在仿真里看起来就是按照数组下标表示了, 理论上它们是互相正交的,但是我们仿真不考虑物理怎么实现, 只"看到"数学上的子载波就行.如下图, 就是被加载了data的子载波们
总结: 仿真只看数学上的子载波, 用数组下标表示每一个即可, 不考虑物理怎么实现;
IFFT/FFT不是对信号进行变换,而是对承载了信号的载波进行变换. 举个栗子: OFDM有200个子载波, 但其中只有64+64个被加载了信号, 即128个data子载波, 还有72个空置的子载波, 不过不要紧, 给它们加载信号值0, 这也就是要实现的过采样.
难点2: ADC的接收端
首先, 接收端接收到的是实信号(IF信号), 然后通过以下这个装置, 不断地反转Vref, 最终可以输出一个收敛于接收信号值的信号值.