zoukankan      html  css  js  c++  java
  • 两通道实信号使用一个FFT同时计算算法

    前言

    在工程的实际应用场景中,往往是需要最省资源量。而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 = 8192;
    n = 0:L-1;
    x1 = load('600k_signal_8192.txt');
    x2 = load('1200k_signal_8192.txt');
    %%构造信号FFT
    y = x1 + x2*j;
    Y = fft(y,8192);
    %%
    X1(1) = 0; %第一个点直流置0即可
    X2(1) = 0;
    for i = 2:8192 %从第二个点开始
        X1(i) = 1/2*(Y(i)+conj(Y(8194-i)));
        X2(i) = -1/2*j*(Y(i)-conj(Y(8194-i)));
    end
    x = n*Fs/(L*1e3)-Fs/(2*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,[8192,1]);
    X2_reshape = reshape(X2,[8192,1]);
    erro1 = abs(X1_reshape - fft(x1));
    erro2 = abs(X2_reshape - fft(x2));
    plot(erro1(2:8192));
    hold on;
    plot(erro2(2:8192));
    title('不同计算结果的相对误差');

    计算结果如下图所示:

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

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

     以上。

  • 相关阅读:
    第四周学习总结
    第十三周编程总结
    2018秋季第十三周助教总结
    第十三周学习总结
    使用函数输出水仙花数 (void的用法)
    ZOJ3229 有源汇上下界最大流
    codeforces-1176 (div3)
    codeforces-1077 (div3)
    牛客假日团队赛1 题解
    牛客练习赛38 离线 启发式合并并查集
  • 原文地址:https://www.cnblogs.com/kingstacker/p/11328842.html
Copyright © 2011-2022 走看看