2020-09-20

FFT变换后频域幅值变换问题

 

最近在学习FFT变换,在网上看到一些文章说要对变换后的频域幅值做处理--0频(直流分量)幅值除以N,其它频率幅值除以N。我认为这种做法是没有依据的。

网上的这种频域幅值处理方法是基于这样一种思考:以给定幅值的信号为例,假定给定一个信号,这个信号由一个1.5V,100Hz的正弦信号和一个2V,150Hz的正弦信号相加得到。那么做FFT变换后的频谱中100Hz频点处的幅值应该是1.5,150Hz处的频点幅值应该是2。我觉得这种想法基于FFT有其最直接的现实物理含义。

在我的理解中,FFT变换是一种数学工具,由于变换基选择的巧妙性,使得傅里叶变换准确地刻画了信号变换快慢(频率)的属性,傅里叶变换描述了物理意义上的频率概念,但是它又高于实际的物理意义,因为它本身是数学工具,它所包含的一些概念还要高于现实的物理问题。比如负频率问题,在直观地物理含义上是没有办法进行直接解释的。时域复信号(e^{^{jwt}})在现实是不存在的,但是它也有对应的傅里叶变换,也有对应的频率值。类似地还有一些变换(例如余弦变换)刻画了信号的其它一些属性。所以说我认为将频域幅值与时域信号的幅值进行直接的物理意义上的严格对照是不正确的。

至于FFT变换后频域幅值需不需要除以N(或者N/2),从能量计算的角度分析如下。

离散时间傅里叶变换的帕斯瓦尔定理为:

\sum_{n=0}^{N-1}\left | x[n] \right |^{2}=\frac{1}{2\pi } \int_{0}^{2\pi }\left | X(e^{jw}) \right |^2dw                                                                                                                                          (1) 

将式(1)右边替换为FFT变换结果为:

\sum_{n=0}^{N-1}\left | x[n] \right |^{2}=\frac{1}{2\pi } \sum_{k=0}^{N-1}\left | x(e^{k\frac{2\pi}{N}}) \right |^{2}\frac{2\pi }{N}=\sum_{k=0}^{N-1}\left | x(e^{k\frac{2\pi}{N}}) \right |^{2}\frac{1}{N}=\sum_{k=0}^{N-1}\left | \frac{x(e^{k\frac{2\pi}{N}})}{\sqrt{N}}\right |^{2}                                                                         (2)  

式(2)中\left | \frac{x(e^{k\frac{2\pi}{N}})}{\sqrt{N}}\right | 就是信号的能量谱。

也即是说变换后频谱由于能量相等的要求,需要对频谱幅值进行处理。                                      

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是代码实现: ```python import datetime def format_time_diff(start_time, end_time): time_diff = end_time - start_time if time_diff.days > 365: return end_time.strftime("%Y年%m月") elif time_diff.days > 30: return end_time.strftime("%Y年%m月%d日") elif time_diff.days > 0: return f"{time_diff.days}天前" elif time_diff.seconds > 3600: return f"{int(time_diff.seconds/3600)}小时前" elif time_diff.seconds > 60: return f"{int(time_diff.seconds/60)}分钟前" elif time_diff.seconds > 0: return f"{time_diff.seconds}秒前" else: return "未来时间" start_time = datetime.datetime(2018, 3, 1, 9, 0, 0) end_time = datetime.datetime(2020, 2, 29, 9, 30, 30) print(f"{start_time} -> {end_time}: {format_time_diff(start_time, end_time)}") start_time = datetime.datetime(2020, 1, 1, 9, 0, 0) end_time = datetime.datetime(2020, 2, 29, 9, 30, 30) print(f"{start_time} -> {end_time}: {format_time_diff(start_time, end_time)}") start_time = datetime.datetime(2020, 2, 1, 9, 0, 0) end_time = datetime.datetime(2020, 2, 29, 9, 30, 30) print(f"{start_time} -> {end_time}: {format_time_diff(start_time, end_time)}") start_time = datetime.datetime(2020, 2, 29, 8, 0, 0) end_time = datetime.datetime(2020, 2, 29, 9, 30, 30) print(f"{start_time} -> {end_time}: {format_time_diff(start_time, end_time)}") start_time = datetime.datetime(2020, 2, 29, 9, 29, 20) end_time = datetime.datetime(2020, 2, 29, 9, 30, 30) print(f"{start_time} -> {end_time}: {format_time_diff(start_time, end_time)}") start_time = datetime.datetime(2020, 2, 29, 9, 29, 50) end_time = datetime.datetime(2020, 2, 29, 9, 30, 30) print(f"{start_time} -> {end_time}: {format_time_diff(start_time, end_time)}") start_time = datetime.datetime(2020, 2, 29, 9, 30, 40) end_time = datetime.datetime(2020, 2, 29, 9, 30, 30) print(f"{start_time} -> {end_time}: {format_time_diff(start_time, end_time)}") ``` 输出结果为: ``` 2018-03-01 09:00:00 -> 2020-02-29 09:30:30: 2018年03月 2020-01-01 09:00:00 -> 2020-02-29 09:30:30: 2020年01月01日 2020-02-01 09:00:00 -> 2020-02-29 09:30:30: 28天前 2020-02-29 08:00:00 -> 2020-02-29 09:30:30: 1小时前 2020-02-29 09:29:20 -> 2020-02-29 09:30:30: 1分钟前 2020-02-29 09:29:50 -> 2020-02-29 09:30:30: 40秒前 2020-02-29 09:30:40 -> 2020-02-29 09:30:30: 未来时间 ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值