信号傅里叶变换后的实数和虚数部分理解

傅里叶(FFT、DFT、傅立叶、Fourier)傅里叶变换的结果为什么含有复数?

为什么傅里叶变换的结果含有复数成份?
看了很多关于FFT的资料,现在看到一个资料说FFT转换的结果是实部+虚部,所以不理解为什么从时域转到频域就会变成复数。

第一,从定义式上看,积分号里含有复数,积分结果是复数;
第二,从傅立叶变换的物理意义上看:FT变换是将一个信号分解为多个信号之和的形式,并且是正弦或余弦信号叠加的形式;我们知道,决定一个正弦波的是其振幅和相位,二者缺一不可;而实数只能表示振幅或者相位,而复数是二维平面上的,可以同时表示振幅和相位,所以用复数表示。频谱是复数形式,可以分解为振幅谱和相位谱,它们是实数形式。
答题不易,望采纳!

  • 追问: 你说的一系列谐波叠加的意思是可以把一个不规则(或者规则)的信号分解成许多正弦和余弦的叠加,然后这些“谐波”每个都是可以用一个复数表示?然后复数的模就表示振幅?辐角表示相位,是我理解的这样的吧? 复数的模(设复数z=a+bi(a,b∈R)则复数z的模|z|=√a²+b²,是这样算吗?) 辐角也不懂是啥意思,听说《复变函数》学会了,这些就都是小菜? 不管如何都会采纳你的,就是想多了解一下,望耐心解答。
  • 追答: 然后这些“谐波”每个都是可以用一个复数表示? 对 然后复数的模就表示振幅?辐角表示相位,是我理解的这样的吧? 对,这里辐角范围理解为[ -pai,pai] 可以看到,振幅全是实数,辐角也全是实数,振幅和相位都与频率一一对应,分别组成振幅谱和相位谱。而它们都包含在频谱里(复数谱)。也就是说频谱即有振幅谱信息,又有相位谱信息。 科学的目的是为了简单。
  • 8
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
实数傅里叶变换(Real Fourier Transform)是一种将时间域信号转换为频域信号的方法。在C语言中,我们可以使用FFT算法来实现实数傅里叶变换。 以下是一个使用C语言实现实数傅里叶变换的示例代码: ```c #include <stdio.h> #include <stdlib.h> #include <math.h> #define PI 3.14159265358979323846 void FFT(int N, double *x, double *y) { int i, j, k, m; double s, t, tr, ti, ur, ui; j = 0; for (i = 0; i < N; i++) { if (j > i) { t = x[j]; x[j] = x[i]; x[i] = t; t = y[j]; y[j] = y[i]; y[i] = t; } m = N / 2; while (m >= 1 && j >= m) { j -= m; m /= 2; } j += m; } k = 0; for (i = 1; i < N; i *= 2) { k++; } for (m = 1; m <= k; m++) { for (i = 0; i < pow(2, m - 1); i++) { s = sin(PI / pow(2, m) * i); t = cos(PI / pow(2, m) * i); ur = 1; ui = 0; for (j = 0; j < pow(2, k - m); j++) { tr = x[i + j * pow(2, m)]; ti = y[i + j * pow(2, m)]; x[i + j * pow(2, m)] = tr * ur - ti * ui; y[i + j * pow(2, m)] = tr * ui + ti * ur; tr = x[i + (j + pow(2, k - m)) * pow(2, m)]; ti = y[i + (j + pow(2, k - m)) * pow(2, m)]; x[i + (j + pow(2, k - m)) * pow(2, m)] = tr * ur - ti * ui; y[i + (j + pow(2, k - m)) * pow(2, m)] = tr * ui + ti * ur; t = ur; ur = t * cos(PI / pow(2, m)) - ui * sin(PI / pow(2, m)); ui = t * sin(PI / pow(2, m)) + ui * cos(PI / pow(2, m)); } } } } int main() { int N = 8; double x[] = {1, 2, 3, 4, 5, 6, 7, 8}; double y[] = {0, 0, 0, 0, 0, 0, 0, 0}; int i; FFT(N, x, y); for (i = 0; i < N; i++) { printf("%f + %f i\n", x[i], y[i]); } return 0; } ``` 在上面的示例代码中,我们定义了一个FFT函数来计算傅里叶变换。该函数采用了Cooley-Tukey算法,使用了迭代的方式来计算实数傅里叶变换。 在main函数中,我们定义了一个长度为8的实数序列x,并初始化为1到8。我们还定义了一个长度为8的虚数序列y,并将其初始化为0。最后,我们调用FFT函数来计算傅里叶变换,并输出结果。 请注意,在实数傅里叶变换中,由于信号实数,因此正频率和负频率是相同的。因此,输出的结果中只包含前N/2个频率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值