DFT的计算步骤是什么?

DFT的计算步骤是什么?,第1张

DFT的计算步骤如下:

离散傅里叶变换(Discrete Fourier Transform,DFT)傅里叶分析方法是信号分析的最基本方法,傅里叶变换是傅里叶分析的核心,通过它把信号从时间域变换到频率祥李歼扰蠢域,进而研谨冲究信号的频谱结构和变化规律。

基本性质

1.线性性质

如果X1(n)和X2(N)是两个有限长序列长度分别为N1和N2,且Y(N)=AX1(N)+BX2(N)。

式中A,B为常数,取N=max[N1,N2],则Y(N)的N点DFT为:

Y(K)=DFT[Y(N)]=AX1(K)+BX2(K), 0≤K≤N-1。

2.循环移位特性

设X(N)为有限长序列,长度为N,则X(N)地循环移位定义为:

Y(N)=X((N+M))下标nR(N)。

式中表明将X(N)以N为周期进行周期拓延得到新序列X'(N)=X((N))下标n,再将X'(N)左移M位,最后取主值序列得到循环移位序列Y(N)。

function y=myditfft(x)

%本程序对输入序列实现DIT-FFT基2算法,点数取大于等于长度的2的幂次

%------------------------------------

%

myditfft.c

%------------------------------------

m=nextpow2(x)

%求的x长度对应的2的最低幂次m

N=2^m

if length(x)<N

x=[x,zeros(1,N-length(x))]

%若的长度不是2的幂,补0到2的整数幂

end

nxd=bin2dec(fliplr(dec2bin([1:N]-1,m)))+1

%求1:2^m数列的倒序

y=x(nxd)

%将倒序排列作为的初始值

for mm=1:m

%将DFT做m次基2分解,从左到右,对每次分解作DFT运算乎耐

Nmr=2^mm

u=1

%旋转因子u初始化

WN=exp(-i*2*pi/Nmr)

%本次分解的基本DFT因子WN=exp(-i*2*pi/Nmr)

for j=1:Nmr/2

%本次跨越间隔内的各次碟形运算

for k=j:Nmr:N

%本次碟形运算的岁租春跨型租越间隔为Nmr=2^mm

kp=k+Nmr/2

%确定碟形运算的对应单元下标

t=y(kp)*u

%碟形运算的乘积项

y(kp)=y(k)-t

%碟形运算的加法项

y(k)=y(k)+t

end

u=u*WN

%修改旋转因子,多乘一个基本DFT因子WN

end

end

#include <stdio.h>

#include <stdlib.h>

#include <math.h>

#include <string.h>

//码卖#define MyE 2.7182818284590452354

//#define GET_ARRAY_LEN(array,len){len = (sizeof(array) / sizeof(array[0]))}

int main()

{

void fft()

int len,i//len=N

printf("Input the size of the array: ")//设定数组大小

if (scanf("%d",&len)==EOF)

return 0

double arr[len]

printf("Input the arry elements:\n")

for (i=0i<leni++)

{

printf("[%d]: (for example: 5<Enter>)",i)

scanf("%lf",&arr[i])

}

//int len//自定义长度迟罩逗闷搭

//GET_ARRAY_LEN(a,len)

//printf("%d\n",len)

printf("Result is :\n")

fft(arr,len)

return 0

}

void fft(double a[],int lang)

{

int N

int n,k

N=lang

double sumsin=0,sumcos=0

for (k=0k<Nk++)

{

for (n=0n<Nn++)

{

sumcos=sumcos+cos(n*k*8*atan(1)/N)*a[n]//8*atan(1)=2π

//printf("n=%d,sumcos=%.1lf",n,sumcos)

//printf("\n")

sumsin=sumsin+(-1)*sin(n*k*8*atan(1)/N)*a[n]

//printf("n=%d,sumcos=%.1lf",n,sumsin)

//printf("\n")

}

printf("x[%d]= %.1lf + %.1lfj",k,sumcos,sumsin)

sumcos=0

sumsin=0

printf("\n")

}

}

【请尊重我的劳动成果,若满意,请及时采纳~~谢谢!!】


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/12524904.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-26
下一篇 2023-05-26

发表评论

登录后才能评论

评论列表(0条)

保存