‘壹’ 单片机实现傅立叶变换
用FPGA这种单片机
在对FFT(快速傅立叶变换)算法进行研究的基础上,描述了用FPGA实现FFT的方法,并对其中的整体结构、蝶形单元及性能等进行了分析。
关键词:
FPGA FFT
傅立叶变换是数字信号处理中的基本操作,广泛应用于表述及分析离散时域信号领域。但由于其运算量与变换点数N的平方成正比关系,因此,在N较大时,直接应用DFT算法进行谱变换是不切合实际的。然而,快速傅立叶变换技术的出现使情况发生了根本性的变化。本文主要描述了采用FPGA来实现2k/4k/8k点FFT的设计方法。
1 整体结构
一般情况下,N点的傅立叶变换对为:
其中,WN=exp(-2 pi/N)。X(k)和x(n)都为复数。与之相对的快速傅立叶变换有很多种,如DIT(时域抽取法)、DIF(频域抽取法)、Cooley-Tukey和Winograd等。对于2n傅立叶变换,Cooley-Tukey算法可导出DIT和DIF算法。本文运用的基本思想是Cooley-Tukey算法,即将高点数的傅立叶变换通过多重低点数傅立叶变换来实现。虽然DIT与DIF有差别,但由于它们在本质上都是一种基于标号分解的算法,故在运算量和算法复杂性等方面完全一样,而没有性能上的优劣之分,所以可以根据需要任取其中一种,本文主要以DIT方法为对象来讨论。
N=8192点DFT的运算表达式为:
式中,m=(4n1+n2)(2048k1+k2)(n=4n1+n2,k=2048k1+k2)其中n1和k2可取0,1,...,2047,k1和n2可取0,1,2,3。
由式(3)可知,8k傅立叶变换可由4×2k的傅立叶变换构成。同理,4k傅立叶变换可由2×2k的傅立叶变换构成。而2k傅立叶变换可由128×16的傅立叶变换构成。128的傅立叶变换可进一步由16×8的傅立叶变换构成,归根结底,整个傅立叶变换可由基2、基4的傅立叶变换构成。2k的FFT可以通过5个基4和1个基2变换来实现;4k的FFT变换可通过6个基4变换来实现;8k的FFT可以通过6个基4和1个基2变换来实现。也就是说:FFT的基本结构可由基2/4模块、复数乘法器、存储单元和存储器控制模块构成,其整体结构如图1所示。
图1中,RAM用来存储输入数据、运算过程中的中间结果以及运算完成后的数据,ROM用来存储旋转因子表。蝶形运算单元即为基2/4模块,控制模块可用于产生控制时序及地址信号,以控制中间运算过程及最后输出结果。
2 蝶形运算器的实现
基4和基2的信号流如图2所示。图中,若A=r0+j*i0,B=r1+j*i1,C=r2+j*i2,D=r3+j*i3是要进行变换的信号,Wk0=c0+j*s0=1,Wk1=c1+j*s1,Wk2=c2+j*s2,Wk3=c3+j*s3为旋转因子,将其分别代入图2中的基4蝶形运算单元,则有:
A′=[r0+(r1×c1-i1×s1)+(r2×c2-i2×s2)+(r3×c3-i3×s3)]+j[i0+(i1×c1+r1×s1)+(i2×c2+r2×s2)+(i3×c3+r3×s3)]� (4)
B′=[r0+(i1×c1+r1×s1)-(r2×c2-i2×s2)-(i3×c3+r3×s3)]+j[i0-(r1×c1-i1×s1)-(
i2×c2+r2×s2)+(r3×c3-i3×s3)] (5)
C′=[r0-(r1×c1-i1×s1)+(r2×c2-i2×s2)-(r3×c3-i3×s3)]+j[i0-(i1×c1+r1×s1)+(i2×c2+r2×s2)-(i3×c3+r3×s3)] (6)
D′=[r0-(i1×c1+r1×s1)-(r2×c2-i2×s2)+(i3×c3+r3×s3)]+j[i0+(r1×c1-i1×s1)-(i2×c2+r2×s2)-(r3×c3-i3×s3)]� (7)
看明白了吗?
‘贰’ 怎样计算一个单片机程序所需rom大小,计算的是fft算法分析及显示所需的容量,请写明详细计算过程,并举例
一般人是不算ROM的大小,至多只是估计。因为一个完整的程序,不同的人,甚至同一个人,程序的思路方法不一样,程序大小会差比较多。而且你的程序,除了算法,还有其他的很多东东,如显示、按键、通信等等,这些可能比你的算法的程序量还要大得多。
所以建议你先用仿真(如PROTEUS仿真),选用足够大的ROM的单片机,编制完整的程序,就知道花了多少的程序空间。
‘叁’ 求个能在51单片机上跑的FFT ~~
这种FFT无意义
‘肆’ 如何实现64点FFT越详细越好!
matlab实现的代码:
x=importdata('aa.txt') %从aa.txt文件中读取数据,64点FFT就取64点数据
n=[1:64]; %64个数据
N=64;
y=fft(x); %进行FFT计算
%输出y
M=abs(y); %取幅值
M(1)=M(1)/2;
plot(n,2*M/N); %绘制幅频图,
title('幅频相应');
xlabel('频率');
ylabel('幅度');
如果要单片机实现的话,cortex及ARM有相应的库函数,但是要注意采样率,采样周期与信号周期的关系,频谱泄露的影响。
‘伍’ 请教用430编写FFT程序
MSP430-FFTB6638 你要说明单片机的型号。 都属于MSP430系列的,大致使用起来就不会差很多,有些寄存器命名、包含模块多少等区别。 P4DIR|=BIT1+BIT2+BIT3:这句是将P4.1 P4.2 P4.3这3个IO口的方向置为输出。 MSP430不同于51,需要先设置输入输出
‘陆’ 如何用matlab产生一组数组,这组数组将作为c编的FFT程序(单片机上)的输入部分。
% 是单频率信号还是带有谐波的信号啊?以下是matlab程序,产生信号数据
fs=2500; % 你给的100ms换算成采样频率是10HZ,这不符合采样定理,建议提高采样频率
f=50;
N=256;
n=1:N;
t=(n-1)/fs;
Am= [30.6 6 15 5 10 18]; % 这个是幅值,如果是单频率,一个数即可
PH= [60 30 90 90 90 90]; % 这个是相位,如果是单频率,同上
m = 6; % 如果是单频率 取 1
x=zeros(1,N);
PH = PH/180*pi; % 如果给的是角度,需要换算成弧度
for k=1 : m
x=x+Am(k)*cos(2*pi*f*k*t+PH(k)); % x就是信号采样后的数据,就是你需要的FFT输入数据
end
‘柒’ 单片机音乐频谱程序求解释!
音乐频谱的解析关键就是FFT函数,它可将幅域信号转换为频域信号,你可以看看相关的高等数学中的信号处理部分。
从jpg图来看,你那个程序将频域设定为16个频点,8个高度值
‘捌’ 如何将一个声音信号输入到单片机里面进行fft求高手
将一个声音信号输入到单片机里面,可以通过麦克风,通常小小的那种咪头(耳机线常佩戴的)那种就可以,它的输出是电压量(声音信号--电信号),你可以用单片机去采样/或者AD芯片对其采样再把数据送个单片机进行处理,单片机内部的处理就可以说是跟matlab里面的处理类似了,而且都是用c语言的,相信很容易上手,祝好运。
‘玖’ 单片机 谁懂FFT
FFT就是快速傅里叶变换,是将时域中的数字信号编程频域,这是数字信号处理的内容,具体是如何进行的,建议你看看数字信号处理这本书