作者:桂。

时间:2018-05-08  18:35:56

链接:http://www.cnblogs.com/xingshansi/p/9010282.html


【本文遗留几处细节问题,待闲下来解决。 其中多处涉及原语,以后若有需要,进一步了解可参考文档:hdl.pdf + CLB.pdf。】

一、模块汇总

  • 13- 4点FFT(fft4)

路径:印象笔记0019/012

基4原语实现。4点FFT变换(其中时域、频域 均为复数信号):

核心代码:

dat_add_0_r[0] <= $signed(dat_r[0]) + $signed(dat_r[2]);
dat_add_0_r[1] <= $signed(dat_r[1]) + $signed(dat_r[3]);
dat_add_0_r[2] <= $signed(dat_r[0]) - $signed(dat_r[2]);
dat_add_0_r[3] <= $signed(dat_i[1]) - $signed(dat_i[3]); dat_add_0_i[0] <= $signed(dat_i[0]) + $signed(dat_i[2]);
dat_add_0_i[1] <= $signed(dat_i[1]) + $signed(dat_i[3]);
dat_add_0_i[2] <= $signed(dat_i[0]) - $signed(dat_i[2]);
dat_add_0_i[3] <= $signed(dat_r[3]) - $signed(dat_r[1]); dat_add_1_r[0] <= $signed(dat_add_0_r[0]) + $signed(dat_add_0_r[1]);
dat_add_1_r[1] <= $signed(dat_add_0_r[2]) + $signed(dat_add_0_r[3]);
dat_add_1_r[2] <= $signed(dat_add_0_r[0]) - $signed(dat_add_0_r[1]);
dat_add_1_r[3] <= $signed(dat_add_0_r[2]) - $signed(dat_add_0_r[3]); dat_add_1_i[0] <= $signed(dat_add_0_i[0]) + $signed(dat_add_0_i[1]);
dat_add_1_i[1] <= $signed(dat_add_0_i[2]) - $signed(dat_add_0_i[3]);
dat_add_1_i[2] <= $signed(dat_add_0_i[0]) - $signed(dat_add_0_i[1]);
dat_add_1_i[3] <= $signed(dat_add_0_i[2]) + $signed(dat_add_0_i[3]);

  

四个数的加减可在3个数加减的基础上扩展(3个数相加),借助1- adder_3op的思路,4个数相加拆解:3个数相加 + 1个数,具体参考:印象笔记:0019/014。同样可以实现FFT/IFFT。【至于3个数加减的优势,本质上应该取决于CLB特性。】

  • 14- 8点FFT(fftr8)

1) 基2原语实现

印象笔记:0019/012,fft_eight.sv

2) 基2、基4原语实现【tb文件存在问题,待排查。】

8点可在4点FFT的基础上进行基2的求解,理论基础:

data = randi(20,[1,8]);
RefFFT = fft(data);
data_odd = data(1:2:end);
data_even = data(2:2:end);
wk = exp(-1j*2*pi/8*[0:3]);
fft_connect = fft(data_even).*wk+fft(data_odd);
[fft_connect,sum(data.*[(-1).^[0:7]]),fliplr(conj(fft_connect(2:end)));RefFFT]

二者完全等价。即8点FFT比4点FFT多了复数相乘、复数相加的基本操作。对于8点的旋转因子: exp(-1j*2*pi/8*[0:3])近有sqrt(2),利用18bits*25bits乘法器,sqrt(2)/2定义为 parameter wk = b = 25'd11863283; //2^0.5/2*2^24,借助rtldelay延拍,利用乘法即可求解。

3)IP核实现

参考:基础006_pg109_IP-Xfft

  • 15- 32点FFT(fftr32)

基2、基4混合基原语实现。基本思路同8点FFT类似。

路径:印象笔记:0019/012,涉及到分时复用,待进一步细化。

  • 16- N点FFT(N为2整次幂)

参数化编程。【暂未编写】

目前的思路是:
1)如果是4的整次幂,则基4实现;

2)如果不是4的整次幂,N/2基4实现,最后一级基2实现。

基4递归的思路参考二、FFT原理简述-Part.B

二、FFT原理简述

本段文字参考:程佩清《数字信号处理》。

  A-基2FFT

DFT与IDFT操作:

快速实现分为DIF、DIT(T:time , F:frequency)两种角度,

DIT2原理:

实现流图:

DIF2原理:

流图:

  B-基4FFT

此处仅记录DIF4,具体可参考基4FFT实现。

matlab仿真:

clear;
a=0:4095;x=sin(2*pi/3*a)+sin(2*pi/4*a)+sin(2*pi/5*a); %输入三频率信号
subplot(2,1,1),plot(x);
axis([0 4096 -3 3]),title('时域信号波形');
subplot(2,2,3),plot(abs(fft(x)));
axis([0 4096 0 2500]),title('系统 FFT 计算出的频谱');
N=4096; %N 点 DFT,N 为 4 的整数次幂
L=log(N)/log(4); %4 点 DFT 分解级数
Wn=exp(-2j*pi/N); %旋转因子
temp=zeros(1,N); %定义中间临时数组
%%%4 进制逆序排序%%%
%这里通过对四进制数 n,先每相邻两位翻转,再将两位合成一组,相邻两组翻转,直到整体翻转一次为止,即可得到 4 进制逆序排序。
n=0:N-1;
screen=ones(1,N);
n=bitor(bitand(n,screen*hex2dec('cccc'))/4,bitand(n,screen*hex2dec('3333'))*4);
n=bitor(bitand(n,screen*hex2dec('f0f0'))/16,bitand(n,screen*hex2dec('0f0f'))*16);
n=bitor(bitand(n,screen*hex2dec('ff00'))/256,bitand(n,screen*hex2dec('00ff'))*256);
n=n/4^(8-L)+1;
for n1=1:N
temp(n(n1))=x(n1);
end
x=temp;
%%%基 4FFT%%%
%这部分根据递推公式以 4 点 DFT 为基本单元,反复进行 L 级迭代,最终得到 N 点 DFT 值。
for l=1:L %运算级循环
group_cont_2=4^(L-l); %第 l 级数据分组数
group_cont_1=4^(L-l+1); %第 l-1 级数据分组数
group_interval_2=4^l; %第 l 级组间数据间隔个数,也是组内数据个数
group_interval_1=4^(l-1); %第 l-1 级组间数据间隔个数,也是组内数据个数
G=group_cont_2-1; %分组上限
K=group_interval_1-1; %组内数据上限
for g=0:G %每一级中包含的组循环,遍历每一组,计算各组中的数据
for k0=0:K %遍历每一组中的所有数据,计算次级数据
k=k0+g*group_interval_2+1; %每组数据中第一个数据序号
m=group_cont_2*k0; %每一级所乘旋转因子的指数因子
k1=k;k2=k1+group_interval_1;k3=k2+group_interval_1;k4=k3+group_interval_1; %每组数据中四个数据的序号
X1=x(k1);X2=Wn^m*x(k2);X3=Wn^(2*m)*x(k3);X4=Wn^(3*m)*x(k4); %将递推公式中重复计算部分用变量代换,减少运算次数
%根据递推公式计算,结果存储到临时数组 temp
temp(k1)=X1+X2+X3+X4;
temp(k2)=X1-1j*X2-X3+1j*X4;
temp(k3)=X1-X2+X3-X4;
temp(k4)=X1+1j*X2-X3-1j*X4;
end
end
x=temp; %将 temp 中临时存储的第 l 级结果赋值给 x,作为次级运算的输入
end
subplot(2,2,4),plot(abs(x));
axis([0 4096 0 2500]),title('自定义基 4FFT 计算出的频谱');

  

Xilinx 常用模块汇总(verilog)【02】的更多相关文章

  1. Xilinx 常用模块汇总(verilog)【04】

    作者:桂. 时间:2018-05-15  13:07:02 链接:http://www.cnblogs.com/xingshansi/p/9040472.html 前言 Xilinx 常用模块汇总(v ...

  2. Xilinx 常用模块汇总(verilog)【03】

    作者:桂. 时间:2018-05-10  2018-05-10  21:03:44 链接:http://www.cnblogs.com/xingshansi/p/9021919.html 前言 主要记 ...

  3. Xilinx 常用模块汇总(verilog)【01】

    作者:桂. 时间:2018-05-07  19:11:23 链接:http://www.cnblogs.com/xingshansi/p/9004492.html 前言 该文私用,不定期更新,主要汇总 ...

  4. npm常用模块汇总

    npm常用模块汇总: 点击插件名字,查看使用文档 npm常用模块汇总 node常用模块汇总 gulp常用插件汇总 npx 使用教程:npx使用教程 bable:bable这是JavaScript编译器 ...

  5. node常用模块汇总

    node常用模块汇总: 点击插件名字,查看使用文档 npm常用模块汇总 node常用模块汇总 gulp常用插件汇总 mkdirp:在node.js中像mkdir -p一样递归创建目录及其子目录

  6. python 所有常用模块汇总

    time:时间 时间戳(timestamp):time.time() 延迟线程的运行:time.sleep(secs) (指定时间戳下的)当前时区时间:time.localtime([secs]) ( ...

  7. Python基础(九) 常用模块汇总

    3.8 json模块重点 json模块是将满足条件的数据结构转化成特殊的字符串,并且也可以反序列化还原回去. 不同语言都遵循的一种数据转化格式,即不同语言都使用的特殊字符串.(比如Python的一个列 ...

  8. 模块、包及常用模块(time/random/os/sys/shutil)

    一.模块 模块的本质就是一个.py 文件. 导入和调用模块: import module from module import xx from module.xx.xx import xx as re ...

  9. npm常用模块之bable使用

    更多npm常用模块使用请访问:npm常用模块汇总 bable这是JavaScript编译器. Babel是一个工具链,主要用于在当前和较旧的浏览器或环境中将ECMAScript 2015+代码转换为J ...

随机推荐

  1. (转)python中调用R语言通过rpy2 进行交互安装配置详解

    python中调用R语言通过rpy2 进行交互安装配置详解(R_USER.R_HOME配置) 2018年11月08日 10:00:11 luqin_ 阅读数:753   python中调用R语言通过r ...

  2. POJ 2318 TOYS (叉乘判断)

    <题目链接> 题目大意: 给出矩形4个点和n个挡板俩顶点的位置,这n个挡板将该矩形分成 n+1块区域,再给你m个点的坐标,然你输出每个区域内有几个点. 解题思路: 用叉乘即可简单判断点与直 ...

  3. P3819 松江1843路

    P3819 松江1843路sigema(r[i]*abs(x[i]-x[s]));令它最小,是带权中位数问题,s是带权中位数,s左边的r[i]之和+r[s]大于s左边的r[i]之和,反过来也成立.如果 ...

  4. Android应用开发-数据存储和界面展现(一)

    常见布局 相对布局(RelativeLayout) 相对布局下控件默认位置都是左上角(左对齐.顶部对齐父元素),控件之间可以重叠 可以相对于父元素上下左右对齐,相对于父元素水平居中.竖直居中.水平竖直 ...

  5. UVA - 1625 Color Length[序列DP 提前计算代价]

    UVA - 1625 Color Length   白书 很明显f[i][j]表示第一个取到i第二个取到j的代价 问题在于代价的计算,并不知道每种颜色的开始和结束   和模拟赛那道环形DP很想,计算这 ...

  6. CF1039C.Network Safety

    目录 题目链接 题解 代码 题目链接 CF1039C.Network Safety 题解 对于一对相邻点,^异或后相同的值唯一a_i ^ t= b_i,a_i ^ b_i = t 对于不在t集合的直接 ...

  7. 潭州课堂25班:Ph201805201 WEB 之 JS 第六课 (课堂笔记)

    上节补充方法 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UT ...

  8. Django关于设置自定义404和安装debug-toolbar的笔记

    Django关于设置自定义404和安装debug-toolbar的笔记 关于设置404 先做好404页面,然后在views.py文件中做好映射,最后是在urls.py做好路由,而这个urls.py必须 ...

  9. redis 在 php 中的应用(Server[ 服务器] 篇)

    本文为我阅读了 redis参考手册 之后编写,注意 php_redis 和 redis-cli 的区别(主要是返回值类型和参数用法) 目录: Server(服务器) BGREWRITEAOF BGSA ...

  10. 什么是物理像素、虚拟像素、逻辑像素、设备像素,什么又是 PPI, DPI, DPR 和 DIP

    什么是物理像素.虚拟像素.逻辑像素.设备像素,什么又是 PPI, DPI, DPR 和 DIP?有关 viewport 以及苹果安卓设备上的页面呈现为什么效果不一样,又有哪些方法去改变和统一呢?网络上 ...