python实现离散沃尔什变换_傅里叶变换原理及Python代码实现
一,前期回顾:
上一节主要讲了傅里叶基数到傅里叶变换,其主要的思想可以总结为两句话。对于傅里叶基数,“一个周期连续的波形可以由多个其周期整数倍的波形组合而成!” 由此给出了公式并进行了系数推导。
从傅里叶基数到傅里叶变换的 idea 为 “ 把周期信号的周期逐渐扩大,当接近无穷大,这样周期信号不就成了非周期的!”
最终我们得出的结论是:我们能够将时域中非周期连续的信号通过傅里叶变换华丽转身到频域中连续非周期的频谱。这在理论上实现了巨大的成功,但是又回到实际中,我们的PC 不能处理连续的信号,数字信号才是PC的菜啊!
本文主要围绕着怎样对信号进行处理,可以使PC能handle!
二,傅里叶变换到离散时间傅里叶变换 (FT 到 DTFT)
首先,我们要明确一点就是傅里叶变换处理的是连续的系统,连续系统,连续系统,重要事情说三遍!
很直接想到的一个idea就是,采样啊,让狄拉克梳状函数上啊!
我们也有一篇专门讲解采样的文章!马尚先生:采样定理,频谱混叠和傅里叶变换 深入理解zhuanlan.zhihu.com
千万别走偏,精彩继续,我们继续往下看。
冲击采样序列即狄拉克梳状函数的表达式为:
采样后的信号为:
形象点如图:Fig.1 狄拉克梳状函数对连续信号进行采样过程简图
连续信号的傅里叶变换为:
采样后信号的傅里叶变换为:
改变下求和积分的顺序,并利用冲击函数的筛选性质。
。可以得到离散时间傅里叶变换公式为:
进一步简化对于数字信号而言,我们只有x(t) 采样后的信号x[n],第n个采样发生在t=nTs 时因此可以将连续信号的傅里叶变换改写为:
小结:
到了这里我们在来总结下上面所做的工作。此时我们已经完成了离散时间傅里叶变换DTFT的公式的推导。在傅里叶变换的基础上,我们对时域的信号进行了采样,将时域连续的信号变为了离散信号并进行傅里叶变换,我们神奇的发现在频域中还是连续的谱线。
因为时域中采样,相当于在频域中以采样频率对信号频率进行周期延拓。Fig.2 解释时域和频域对偶问题
问题:
此时时域信号离散了,但是频域信号还是连续的,我们要的是时域和频域都是离散的这样PC才可能处理,现在又该怎么办呐?
下面是我自己的理解,思路是这样的!
现在只有频域是连续的,可以采用和时域相同的方法,再对频域进行采样不就可以了吗!在利用 “一个域与信号相乘等同于在另一个域中卷积”原理。我们在频域中将连续的频谱与狄拉克梳状函数相乘,这样时域等同于把信号以采样频率为周期进行延拓。
这样做的前提是提前在时域中选取N个点作为一个周期,这样在延拓的时候才有东西可以延拓。
思路是这样下面我们来具体的实现下!
三,离散傅里叶变换 DFT
首先在时域中选取N个点,说白了就是对时域连续信号x(t) 进行N点采样,然后将N点采样信号进行周期延拓,虚拟成周期离散的信号并将其进行离散傅里叶变换,得到的频域谱图也是周期离散的。有的小同志就发现了你时域中信号周期延拓,频域也是周期的,是不是只观察频域中的一个区间的取值就可以知道信号的全貌。对的,一般我们只取主值区间[0,N-1]即可,因为其他都是相同的。
有了思路我们在理论上推导下。
对连续的信号进行N点的采样得到信号的表达式为,这个公式似曾相识啊! 注意上下标,哈哈
将假想为N个点做周期延拓,取主值区间进行傅里叶变换,有:
积分和求和的顺序调换下,并利用狄卡拉梳状函数的筛选特性得:
当把T换为N时,即只有在 t=nTs 时候有值,上式可以化简为
此式为离散周期傅里叶变换,理论上讲周期信号的频谱为无穷多的,但是由于
的周期性,即
一般只取0 到N-1. 此式即为离散傅里叶公式。
有的同志又注意到了,最后的n 是对应的点数而不是频率啊,这怎样转换到频率那?看下面的公式:
也可以写为
, 其中N为做FFT的点数,fs 为采样频率。
所以离散周期傅里叶变换后的第k个数对应的频率是
,fs/N 可以理解为频率分辨率。
四,实际应用中的小问题
1,为什么最好进行2次幂个点数的FFT运算?
在实际的应用中如果直接按DFT变换进行计算,当序列长度N很大时,计算量会非常大,所需时间也很长,因此常用的是DFT的一种快速计算算法快速傅里叶变换FFT。
最常用的FFT算法是基于时间抽取的基2-FFT算法和基于频率抽取的基2-FFT算法,这种算法的特点在于FFT会把一次大的DFT分割成几个小的DFT,这样递归式地细分下去,例如有8个采样点的FFT,首先会把最外层的8点运算分成两个4点FFT的奇偶组合,第二层FFT又分成四个两点FFT的奇偶组合,并且由此计算出的频谱中很有趣的一点在于对于实数输出的数组,后面一半和前面一半正好对称相同,对于虚数输出的数组,后面一半是前面数组对称后乘上负1,因此,我们只需要算出FFT的一半即可求出全部。
所以在进行FFT的时候一般选取2 的次幂个点数进行快速傅里叶变换。
2,显示分辨率和实际分辨率。
在选取N个点数做FFT以后一遍要乘以频率分辨率来得到相应的频率左边,频率分辨率的公式为Fre = Fs/N, 这里N的取值不同,得到结果的意义也就不同,当除以信号本身的长度时候为实际的频率分辨率,当信号不够2 的整数次幂,进行补零凑齐以后,此时N如果取补零以后的个数,那么此时的分辨率为显示分辨率,实际分辨率并没有提高。
例如,要求的频率分辨率要达到0.5 Hz 此时的采样率 fs =10 kHz, 那么要满足要求,采样的点数必须最少为20 K 个点,否者无法满足要求。
3,MATLAB 中FFT 的实现
NFFT = 2^nextpow2(L); % Next power of 2 from length of y
Y = fft(y,NFFT)/L;
f = Fs/2*linspace(0,1,NFFT/2+1);
% Plot single-sided amplitude spectrum.
plot(f,2*abs(Y(1:NFFT/2+1)))
4,MATLAB 中的FFTshift 是怎么个意思?
信号以采样频率fs进行采样会在在 fs/2处混叠,所以实信号fft的结果中前半部分对应[0, fs/2],后半部分对应[ -fs/2, 0],大于fs/2的部分的频谱实际上是信号的负频率加fs的结果。故要得到正确的负频率的结果,只需将视在频率减去采样频率fs即可得到频谱对应的真实负频率。
进行N 点的FFT 最后输出的结果是以fs/2 为中心的频谱,如果只想显示正的频率,只显示[0, fs/2] 即可,如果想要显示负的频率,此时就需要fftshift 一下了,把 对称的中心从fs/2 移动到 0 点。具体的结果如下:Fig MATLAB 中 fftshift 作用和实现
完整MATLAB 代码
clear
fs=200;N=512; %采样频率和数据点数
n=0:N-1;t=n/fs; %时间序列
x=0.9*sin(2*pi*20*t)+2*sin(2*pi*80*t); %信号
y1=fft(x,N); %对信号进行FFT
y2=fftshift(y1);
mag1=2*abs(y1)/N; %求得Fourier变换后的振幅
mag2=2*abs(y2)/N;
f1=n*fs/N; %频率序列
f2=n*fs/N-fs/2;
fig1=figure();
subplot(3,1,1);
plot(f1,mag1,'r'); %绘出随频率变化的振幅
xlabel('频率/Hz');
ylabel('振幅');
title('图1 正常FFT ');
grid on;
subplot(3,1,2),plot(f2,mag1,'b'); %绘出随频率变化的振幅
xlabel('频率/Hz');
ylabel('振幅');
title('图2 直接平移fs/2,频率不是很对');
grid on;
subplot(3,1,3);
plot(f2,mag2,'g'); %绘出随频率变化的振幅
xlabel('频率/Hz');
ylabel('振幅');title('图3 把频率对称点移到0点');
grid on;
saveas (fig1,'fftshift11.jpg')
python 中 FFT 实现方法
详见以下链接:马尚先生:Python 中 FFT 快速傅里叶分析zhuanlan.zhihu.com
相关知识链接
感谢看到最后,希望对你有帮助,点个赞吧!
python实现离散沃尔什变换_傅里叶变换原理及Python代码实现相关推荐
- 典型相关分析python实现_CCA典型关联分析原理与Python案例
文章来源于"脑机接口社区"CCA典型关联分析原理与Python案例mp.weixin.qq.com Rose今天分享一下CCA的相关原理以及Python应用,CCA在EEG等脑电 ...
- 我的python学习笔记全集_记录我的Python学习笔记
不想再像以前那样,什么都从头开始学习语法.总结语法,这样反而会过分纠结于语法,耽误了开发,毕竟语言的主要属性是工具,次要的属性是语言本身. 所以还是先熟练使用语言去进行开发,等足够熟悉了,再去研究语言 ...
- 高考python必考题目_假如高考考python编程,这些题目你会几个呢?
Python(发音:英[?pa?θ?n],美[?pa?θɑ:n]),是一种面向对象.直译式电脑编程语言,也是一种功能强大的通用型语言,已经具有近二十年的发展历史,成熟且稳定.它包含了一组完善而且容易理 ...
- python拼图游戏编码_教你用Python自制拼图小游戏,轻松搞定熊孩子
摘要:本文主要为大家详细介绍了python实现拼图小游戏,文中还有示例代码介绍,感兴趣的小伙伴们可以参考一下. 开发工具 Python版本:3.6.4 相关模块: pygame模块: 以及一些Pyth ...
- python自制小游戏_教你用Python自制拼图小游戏,一起来制作吧
摘要: 本文主要为大家详细介绍了python实现拼图小游戏,文中还有示例代码介绍,感兴趣的小伙伴们可以参考一下. 开发工具 Python版本:3.6.4 相关模块: pygame模块: 以及一些Pyt ...
- python 书籍 办公 自动化_你们都用Python实现了哪些办公自动化?
这可能是很多非IT职场人士面临的困惑,想把python用到工作中,却不知如何下手?python在自动化办公领域越来越受欢迎,批量处理简直是加班族的福音. 自动化办公无非是excel.ppt.word. ...
- python批量处理 办公_你们都用Python实现了哪些办公自动化?
这可能是很多非IT职场人士面临的困惑,想把python用到工作中,却不知如何下手?python在自动化办公领域越来越受欢迎,批量处理简直是加班族的福音. 自动化办公无非是excel.ppt.word. ...
- python怎么重启内核_解决jupyter运行pyqt代码内核重启的问题
在jupyter notebook或者是 Qtconsole下编译运行一个简单的pyqt程序,总是报错: The kernel appears to have died. It will restar ...
- python怎么打日志_怎样调试 日志 python 代码
展开全部 使用 pdb 进行调试 pdb 是 python 自带e5a48de588b662616964757a686964616f31333361306366的一个包,为 python 程序提供了一 ...
- c++中的引用和python中的引用_对比 C++ 和 Python,谈谈指针与引用
作者 | 樱雨楼 引言 指针(Pointer)是 C.C++ 以及 Java.Go 等语言的一个非常核心且重要的概念,而引用(Reference)是在指针的基础上构建出的一个同样重要的概念. 指针对于 ...
最新文章
- 019_MySQL正则表达式
- Educational Codeforces Round 89 (Rated for Div. 2)(A, B, C, D)
- Photoshop切图学习
- 如何使柱状图左右展示_Excel多次层柱状图,让数据展示更清晰,简单五步就完成...
- C语言错误处理方法、C++异常处理方法(throw, try, catch)简介
- 使用C#Visual Studio2015编写Android应用程序详细步骤
- Python入门--字典的创建
- 漏洞分析C#反编译软件Reflector 11.1.0.2167(最新版)(附补丁下载)
- uppy JavaScript 文件上传
- Python 正则表达式匹配中文
- 金融行业用户画像最佳实践
- 解决deep freeze冰点还原软件无法冻结的问题:计算机正在完成Deep Freeze冰点检测到的待定Windows更新
- 网站建设及上线的详细步骤(原创)
- java nio wakeup_Java NIO的wakeup剖析
- 投入产出表matlab,投入产出分析投入产出表.doc
- springboot 相同类名但不同包,报错non-compatible bean definition of same name and class
- 关于移位密码的破解问题
- 关于tp-link wr740 v4的刷机救砖的办法(非线刷解决)恢复原版的
- 浅谈《英雄杀》5人局之反贼技巧
- 2020华为春招--N阶方阵旋转(python)
热门文章
- 图像语义分割(16)-DUpsampling-新型上采样模块:能够聚合丰富特征的数据相关型解码方式(CVPR2019)
- AGV机器人(1)基于视觉避障的理论基础
- 2021全球国际化大学排名发布:中国大学居世界第一!
- Tensorflow实现VGG网络
- 使用Connector / Python查询MySQL数据
- (6)ASP.NET Core 中使用IHttpClientFactory发出HTTP请求
- Python之路-Day2
- 第三方登录、支付接口本地代码调试方法
- linux MySQL5.7 rpm安装
- 进程和cpu的相关知识和简单调优方案