桂林电子科技大学毕业设计(论文)报告用纸 第 19 页 共 37 页
N = 64; % FFT Precision A = 2^11 - 1; % Magnification
%%%%%%%%% Cosine Factors %%%%%%%%%
fid = fopen('fft_cos.mif','w'); % MIF header
fprintf(fid,'%s%d%s\\n','WIDTH=',WIDTH,';'); fprintf(fid,'%s%d%s\\n','DEPTH=',DEPTH,';'); fprintf(fid,'\\n');
fprintf(fid,'%s\\n','ADDRESS_RADIX=UNS;'); fprintf(fid,'%s\\n','DATA_RADIX=DEC;'); fprintf(fid,'\\n');
fprintf(fid,'%s\\n','CONTENT BEGIN'); % Cosine datas for i = 0 : DEPTH-1
a = round(A*cos(2*pi*i/N)); fprintf(fid,'%d:%d;\\n',i,a); end % MIF end
fprintf(fid,'%s','END;'); fclose(fid);
%%%%%%%%% Sine Factors %%%%%%%%%
fid = fopen('fft_sin.mif','w'); % MIF header
fprintf(fid,'%s%d%s\\n','WIDTH=',WIDTH,';'); fprintf(fid,'%s%d%s\\n','DEPTH=',DEPTH,';'); fprintf(fid,'\\n');
fprintf(fid,'%s\\n','ADDRESS_RADIX=UNS;'); fprintf(fid,'%s\\n','DATA_RADIX=DEC;'); fprintf(fid,'\\n');
fprintf(fid,'%s\\n','CONTENT BEGIN'); for i = 0 : DEPTH-1
桂林电子科技大学毕业设计(论文)报告用纸 第 20 页 共 37 页
a = round(A*sin(2*pi*i/N)); fprintf(fid,'%d:%d;\\n',i,a); end % MIF end
fprintf(fid,'%s','END;'); fclose(fid);
4.3.13两组RAM的切换
输入数据存储在RAM1中,输入完毕开始从RAM1中取数并按照取址顺序取出然后送入蝶形运算单元,运算完成后再按照存储顺序存入RAM2中。第二级从RAM2中取数并存入RAM1中,如此交替进行乒乓存储操作。根据64点FFT需要进行6级蝶形,所以FFT计算结果从RAM1中取出。
4.3.14蝶形运算单元设计
FFT的核心单元操作时蝶形运算,蝶形运算直接影响着FFT处理器的速度。由于64=2^6,64/2仍然是偶数,继续将32点DFT分成偶数组和奇数组,这样每个32点又可由两个16点DFT形成,其输入序列分别是x1(n)和x2(n),按上下对半分开形成的四个子序列。图4.7.1显示出N?8点时的FFT运算流图。这种算法是对X(k)进行奇偶抽取分解的结果,所以称之为频域抽取法FFT,共有M级运算,每级共有N/2个蝶形运算。本FFT模块采用顺序输入倒序输出的基于频域抽取的基2算法,与基于时域抽取的基基于时域抽取的基2蝶形是先乘后加(减),而本算法蝶形是先加(减)2-FFT运算不同,
后相乘。本算法的蝶形运算流图符号如下图所示:
图4-5 蝶形运算流图(8点)
根据上面的分析,基2频域抽取FFT可分解为:
Xm?1(p)R?Xm?1(p)Irr????q??q?RIWNRXmWNI? (4-9) mrr?Xm(p)I??Xm?q?R?WNI?Xm?q?I?WNR? (4-10)
Xm(p)R??X 桂林电子科技大学毕业设计(论文)报告用纸 第 21 页 共 37 页
Xm?1(q)R?Xm(p)R?Xm?1(q)I?Xm(p)I?X??Xrr????q??q?RIWNRXmWNI? (4-11) mrr????q??q?RWNIXmIWNR? (4-12) m 其中p,q表示序列,下标I,R表示虚部和实部。
4.3.15突发FFT模块设计
OFDM调制模块大部分采用16MHz系统时钟,如果按照需要的数据速率,则FFT模块
需要在5us内计算完成一次64点数据的FFT,而16MHz的FFT系统时钟无法满足要求。因此,设计FFT模块为突发形式,输入输出接口采用16MHz的数据传输速率,而内部FFT计算时钟采用100MHz,输出输出采用FIFO模块来进行两个不同时钟域数据的传输。经测试,该设计可以满足5us计算完成64点FFT的设计要求。 4.3.16加入CP循环前缀和加窗模块
循环前缀:
OFDM技术可以有效对抗多径时延扩展,为了最大程度消除ISI,需要在每个OFDM符号间插入循环前缀信号CP,即将每个OFDM符号后的Ts时间中的样值复制到OFDM符号前面行程前缀,添加循环前缀是利用离散线性系统中的一个概念,在连续的时间域,两个时域信号的卷积等于频域信号的乘积。由于循环前缀使所传输的OFDM信号表现出周期性,这种卷积就成了圆周卷积,根据离散时间线性系统的原理,这种圆周卷积相当于OFDM信号的频率响应和信道频率响应的乘积。
加窗:
添加循环前缀后,对数据还要进行加窗操作,加窗操作可以是OFDM符号在带宽之外的功率谱密度下降得更快。
对OFDM符号加窗意味着令符号周期边缘的幅度值逐渐过渡到零。通常采用的窗类型是升余弦函数,其定义如下:
(4-6)
其中β为滚降因子;T是加窗符号的长度,而加窗后的符号长度应为(1+β)T 带宽之外的功率下降速度取决于滚降因子β的取值
4.3.17速度计算
首先在想知道系统时钟的频率前,我们需要计算出每个符号的持续时间ts。 我们知道传输的子载波数为31,对于4QAM,每个载波代表2bit。 数据速率为31*2*1/ts
桂林电子科技大学毕业设计(论文)报告用纸 第 22 页 共 37 页
要求的传输速率为12.4Mbps 传输速率12.4Mbps=31*2*1/ts
这样可以求出ts=(31*2)/12.4Mbps=5us
1个符号持续时间ts = 保护间隔 tgi + 符号数据时间 td
保护间隔一般取符号数据时间td的1/4,则( td + (1/4)*td )=5us
? td = 4us
图4-6速度计算图
5us 80个数据,则一个数据占时间5us/80=0.0625us,系统时钟设置为
1/0.0625us=16MHz
5 综合调试结果
使用串口调试助手进行调试,以及功能测试。
由上面介绍的设计思路可以知道,需要发满8个字,FIFO才传出数据一次。由下图可知道,在发送数据栏内填入想要发送的数据,这里是FC为例,连续输入8个字的数据,即FC FC FC FC FC FC FC FC ,然后点击发送,在大空白处显示接收到的数据,得到FC FC FC FC FC FC FC FC,与输入结果相同。
图5-1 串口助手测试1图
相关推荐: