前言

在工程的实际应用场景中,往往是需要最省资源量。而DSP资源和BRAM资源对FPGA来说弥足珍贵。

对于同时存在多个通道的实信号需要做FFT而言,常规做法是每个通道用一个FFT IP,FFT IP的输入为RE+0*j。即输入FFT IP的虚部直接置0。

那有没有可能把这个虚部浪费掉的资源用起来呢,答案是肯定的。

参考文档

http://www.doc88.com/p-0394736871727.html

https://wenku.baidu.com/view/e89895af9ec3d5bbfc0a7403.html

基础知识

什么叫复数共轭对?

如果一个复数为a+b*j,那么它的共轭就是a-b*j。两者称为复数共轭对。

FFT的输出规律是啥?

如下图所示,对于N点FFT的输出,第1个点为直流分量,从第2个点开始是关于2N/2这个点共轭对称的。比如第2个点跟第N个点是共轭对称的。

算法流程

有两路同时的实信号需要进行计算,则可以使用1个N点的FFT就可以实现N点双路实信号的并行计算。

(1)   设x1(n)和x2(n)为两个N点的实序列。

(2)   构造新序列:x(n) = x1(n) + x2(n)*j。

(3)   计算x(n)的FFT,得到X(K) = RE(K) + IM(K)*j。

(4)   利用对称性,就有:  FFT(x1(n)) = [X(K) + X*(N-K)]/2

FFT(x2(n)) = -j*[X(K) - X*(N-K)]/2

从而实现了x1(n),x2(n)的FFT。

注意:X*(N-K)为X(N-K)的共轭。上述中的第4点直流信号是不予考虑的,对工程应用无意义,直流信号点直接置0即可。

Maltab算法验证

令Fs=6M,x1信号为600k,x2信号为1200k,FFT点数为8192。

matlab代码可如下所示:

%%powered by kingstacker
%%
clc; %clear
clear all;
close all;
Fs = 6e6;
L = ;
n = :L-;
x1 = load('600k_signal_8192.txt');
x2 = load('1200k_signal_8192.txt');
%%构造信号FFT
y = x1 + x2*j;
Y = fft(y,);
%%
X1() = ; %第一个点直流置0即可
X2() = ;
for i = : %从第二个点开始
X1(i) = /*(Y(i)+conj(Y(-i)));
X2(i) = -/*j*(Y(i)-conj(Y(-i)));
end
x = n*Fs/(L*1e3)-Fs/(*1e3); %x axis
plot(x,fftshift(db(abs(X1))));
hold on ;
plot(x,fftshift(db(abs(X2))));
title('同一个FFT算法结果');
figure ;
plot(x,fftshift(db(abs(fft(x1)))));
hold on;
plot(x,fftshift(db(abs(fft(x2)))));
title('x1,x2分别FFT计算结果');
figure;
X1_reshape = reshape(X1,[,]);
X2_reshape = reshape(X2,[,]);
erro1 = abs(X1_reshape - fft(x1));
erro2 = abs(X2_reshape - fft(x2));
plot(erro1(:));
hold on;
plot(erro2(:));
title('不同计算结果的相对误差');

计算结果如下图所示:

可以看到由同一个FFT的计算算法结果跟分别FFT计算的输出结果误差很小,结果一致。

下一步就是FPGA中的具体实现啦。

以上。

两通道实信号使用一个FFT同时计算算法的更多相关文章

  1. CUDA cufftPlanMany的用法_31通道32*8像素的FFT

    #include <cufft.h> #include <iostream> #include <cuda_runtime.h> #include <help ...

  2. 离散傅里叶变换的衍生,负频率、fftshift、实信号、共轭对称

    封面是福州的福道,从高处往下看福道上的人在转圈圈.从傅里叶变换后的频域角度来看,我们的生活也是一直在转圈圈,转圈圈也是好事,说明生活有规律,而我们应该思考的是,如何更有效率地转圈圈--哦别误会,我真不 ...

  3. 用两个Stack来实现一个Queue

    import java.util.Stack; /** * 问题:用两个Stack来实现一个Queue; * 方法:栈的特点是先进后出:而队列的特点是先进先出: * 用两个栈正好能把顺序调过来: * ...

  4. ----------jqery和js如何判断checkbox是否选中 --------两个单选按钮如何选一个,且用jquery获取被选的值

    jqery和js如何判断checkbox是否选中 jquery: <div id="divId" class="divTable"> <div ...

  5. 一个类有两个方法,其中一个是同步的,另一个是非同步的; 现在又两个线程A和B,请问:当线程A访问此类的同步方法时,线程B是否能访问此类的非同步方法?

    一个类有两个方法,其中一个是同步的,另一个是非同步的:现在又两个线程A和B,请问:当线程A访问此类的同步方法时,线程B是否能访问此类的非同步方法? 答案:可以 验证 package com.my.te ...

  6. 两周“学会”bootstrap搭建一个移动站点

    一直想着用bootstrap搭建网站,它的自适应.元素封装完善.现成的Glyphicons字体图标,省去很多的css.js.ui的工作,可以快速搭建一个客户需要的站点.ytkah自己有一些div+cs ...

  7. C/C++ 中##(两个井号)和#(一个井号)用法

    ##(两个井号)和#(一个井号)都是什么意思 连接符 ##(两个井号) 不知道什么符 #(一个井号) ## 连接符号由两个井号组成,其功能是在带参数的宏定义中将两个子串(token)联接起来,从而形成 ...

  8. Java中如何把两个数组合并为一个

    在Java中,如何把两个String[]合并为一个? 看起来是一个很简单的问题.但是如何才能把代码写得高效简洁,却还是值得思考的.这里介绍四种方法,请参考选用. 一.apache-commons 这是 ...

  9. C++中##(两个井号)和#(一个井号)用法

    C(和C++)中的宏(Macro)属于编译器预处理的范畴,属于编译期概念(而非运行期概念).下面对常遇到的宏的使用问题做了简单总结.关 于#和##在C语言的宏中,#的功能是将其后面的宏参数进行字符串化 ...

随机推荐

  1. shell编程系列19--文本处理三剑客之awk中的字符串函数

    shell编程系列19--文本处理三剑客之awk中的字符串函数 字符串函数对照表(上) 函数名 解释 函数返回值 length(str) 计算字符串长度 整数长度值 index(str1,str2) ...

  2. k8s记录-kubeadm安装(一)(转载)

    配置 kubeadm 概述 安装 kubernetes 主要是安装它的各个镜像,而 kubeadm 已经为我们集成好了运行 kubernetes 所需的基本镜像.但由于国内的网络原因,在搭建环境时,无 ...

  3. Locust-参数化批量注册(还没试,目测试可以的)

    前言 实现场景:所有并发虚拟用户共享同一份测试数据,并且保证虚拟用户使用的数据不重复.例如,模拟10用户并发注册账号,总共有100个手机号,要求注册账号不重复,注册完毕后结束测试 准备数据 虚拟用户 ...

  4. html如何修改hr水平直线的粗细

    hr是常见的超文本标签,是一条水平直线,要设置该直线变粗一些.可以先把hr本身的border隐藏掉,然后设置border-top-width,也就是只留上边框,如图:hr的默认高度height是0,所 ...

  5. 【嵌入式硬件Esp32】Ubuntu18.04 更换阿里云软件源

    使用Ubuntu 的apt-get来安装软件是总是因为官方源的速度太慢而抓狂. 但是用阿里云的源就很快,下面总结一下如何更换Ubuntu的软件源. 一.备份sudo cp /etc/apt/sourc ...

  6. 管道式编程(Pipeline Style programming)

    受 F# 中的管道运算符和 C# 中的 LINQ 语法,管道式编程为 C# 提供了更加灵活性的功能性编程.通过使用 扩展函数 可以将多个功能连接起来构建成一个管道. 前言 在 C# 编程中,管道式编程 ...

  7. 如何优雅的处理 async/await 异常

    参考链接:https://cloud.tencent.com/developer/article/1470715 参考链接:https://www.jianshu.com/p/2935c0330dd2

  8. Jmeter + Ant 构建接口自动化

    1.首先安装ANT,解压,建议放根目录. 对应安装包已上传 2.环境变量配置新建 ANT_HOMEANT_HOME:解压的路径path环境配置新增Path:%ANT_HOME%\binclasspat ...

  9. python基础篇(一)

    PYTHON基础篇(一) 变量 赋值 输入,输出和导入 A:输入 B:输出 C:导入 运算符 A:算数运算符 B:比较运算符 C:赋值运算符 D:位运算符 E:逻辑运算符 F:成员运算符 G:身份运算 ...

  10. 【转帖】linux date 显示指定时区的时间 借助TZ 环境变量 export TZ=Asia/Shanghai 或 America/New_York

    linux date 显示指定时区的时间 借助TZ 环境变量 export TZ=Asia/Shanghai 或 America/New_York 2015-02-10 10:58:22 youcha ...