位置: IT常识 - 正文

快速傅里叶变换及Python代码实现(快速傅里叶变换matlab)

编辑:rootadmin
快速傅里叶变换及Python代码实现 一、前言

推荐整理分享快速傅里叶变换及Python代码实现(快速傅里叶变换matlab),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:快速傅里叶变换及其应用实验报告,快速傅里叶变换实验报告,快速傅里叶变换及其应用实验报告,快速傅里叶变换FFT公式,快速傅里叶变换的意义和理解,快速傅里叶变换的意义和理解,快速傅里叶变换的意义和理解,快速傅里叶变换FFT公式,内容如对您有帮助,希望把文章链接给更多的朋友!

  我想认真写好快速傅里叶变换(Fast Fourier Transform,FFT),所以这篇文章会由浅到细,由窄到宽的讲解,但是傅里叶变换对于寻常人并不是很容易理解的,所以对于基础不牢的人我会通过前言普及一下相关知识。

  我们复习一下三角函数的标准式:

y=Acos⁡(ωx+θ)+k

  A代表振幅,函数周期是2πw,频率是周期的倒数w2π,θ是函数初相位,k在信号处理中称为直流分量。这个信号在频域就是一条竖线。

  我们再来假设有一个比较复杂的时域函数y=f(t),根据傅里叶的理论,任何一个周期函数可以被分解为一系列振幅A,频率ω或初相位θ正弦函数的叠加

y=A1sin(ω1t+θ1)+A2sin(ω2t+θ2)+A3sin(ω3t+θ3)

  该信号在频域有三条竖线组成,而竖线图我们把它称为频谱图,大家可以通过下面的动画了解

  如图可知,通过时域到频域的变换,我们得到了一个从侧面看的频谱,但是这个频谱并没有包含时域中全部的信息。因为频谱只代表每个正弦波对应频率的振幅是多少,而没有提到相位。基础的正弦波Asin(wt+θ)中,振幅,频率,相位缺一不可,不同相位决定了波的位置,所以对于频域分析,仅仅有频谱(振幅谱)是不够的,我们还需要一个相位谱。

  我依稀记得高中学正弦函数的是时候,θ的多少决定了正弦波向右移动多少。当然那个时候横坐标是相位角度,而时域信号的横坐标是时间,因此我们只需要将时间转换为相位角度就得到了初相位。相位差则是时间差在一个周期中所占的比例

θ=2πtT

  所以傅里叶变换可以把一个比较复杂的函数转换为多个简单函数的叠加,将时域(即时间域)上的信号转变为频域(即频率域)上的信号,看问题的角度也从时间域转到了频率域,因此在时域中某些不好处理的地方,在频域就可以较为简单的处理,这就可以大量减少处理信号计算量。信号经过傅里叶变换后,可以得到频域的幅度谱以及相位谱,信号的幅度谱和相位谱是信号傅里叶变换后频谱的两个属性。

傅里叶用途

时域复杂的函数,在频域就是几条竖线求解微分方程,傅里叶变换则可以让微分和积分在频域中变为乘法和除法傅里叶变换相关函数

  假设我们的输入信号的函数是

S=0.2+0.7∗cos⁡(2π∗50t+20180π)+0.2∗cos⁡(2π∗100t+70180π)

可以发现直流分量是0.2,以及两个余弦函数的叠加,余弦函数的幅值分别为0.7和0.2,频率分别为50和100,初相位分别为20度和70度。

freqs = np.fft.fftfreq(采样数量, 采样周期)  通过采样数与采样周期得到时域序列经过傅里叶变换后的频率序列

np.fft.fft(原序列)  原函数值的序列经过快速傅里叶变换得到一个复数数组,复数的模代表的是振幅,复数的辐角代表初相位

np.fft.ifft(复数序列)  复数数组 经过逆向傅里叶变换得到合成的函数值数组

案例:针对合成波做快速傅里叶变换,得到分解波数组的频率、振幅、初相位数组,并绘制频域图像。

 python代码实现

 MATLAB实现

补充一些复数知识(很重要):

1、复数S的几种表示形式:

实部、虚部(直角坐标系):a+bj      (a是实部,b是虚部)幅值、相位(指数系):rejθ  (r是幅值,θ是相角,ejθ是相位)极坐标表示法:r∠θ指数系<−−>指教坐标系:rejθ=r(cosθ+jsinθ)=rcosθ+jrsinθ

  因此,我们可以通过以下方法得到:

实部: a=rcosθ, real = np.real(S) 

虚部: b=rsinθ, imag= np.imag(S) 

幅值:r=a2+b2, magnitude = np.abs(S)  或  magnitude = np.sqrt(real**2+imag**2) 

相角(以弧度为单位rad):θ=tan−1(ba) 或 θ=atan2(b,a)。 angle = np.angle(D(F, T)) 

相角(以角度为单位deg):deg=rad∗180π,rad2deg(atan2(b,a))。 deg = rad * 180/np.pi  

相位: phase = np.exp(1j * np.angle(S)) 

基于傅里叶变换的频域滤波

从某条曲线中除去一些特定的频率成份,这在工程上称为“滤波”。

含噪信号是高能信号与低能噪声叠加的信号,可以通过傅里叶变换的频域滤波实现降噪。

通过FFT使含噪信号转换为含噪频谱,去除低能噪声,留下高能频谱后再通过IFFT留下高能信号。

快速傅里叶变换及Python代码实现(快速傅里叶变换matlab)

案例:基于傅里叶变换的频域滤波为音频文件去除噪声。

  1、读取音频文件,获取音频文件基本信息:采样个数,采样周期,与每个采样的声音信号值。绘制音频时域的:时间/位移图像

import numpy as npimport numpy.fft as nfimport scipy.io.wavfile as wfimport matplotlib.pyplot as plt# 读取音频文件sample_rate, noised_sigs = wf.read('./da_data/noised.wav')print(sample_rate) # sample_rate:采样率44100print(noised_sigs.shape) # noised_sigs:存储音频中每个采样点的采样位移(220500,)times = np.arange(noised_sigs.size) / sample_rateplt.figure('Filter')plt.subplot(221)plt.title('Time Domain', fontsize=16)plt.ylabel('Signal', fontsize=12)plt.tick_params(labelsize=10)plt.grid(linestyle=':')plt.plot(times[:178], noised_sigs[:178], c='orangered', label='Noised')plt.legend()

  2、基于傅里叶变换,获取音频频域信息,绘制音频频域的:频率/能量图像

# 傅里叶变换后,绘制频域图像freqs = nf.fftfreq(times.size, times[1] - times[0])complex_array = nf.fft(noised_sigs)pows = np.abs(complex_array)plt.subplot(222)plt.title('Frequency Domain', fontsize=16)plt.ylabel('Power', fontsize=12)plt.tick_params(labelsize=10)plt.grid(linestyle=':')# 指数增长坐标画图plt.semilogy(freqs[freqs > 0], pows[freqs > 0], c='limegreen', label='Noised')plt.legend()

  3、将低频噪声去除后绘制音频频域的:频率/能量图像

# 寻找能量最大的频率值fund_freq = freqs[pows.argmax()]# where函数寻找那些需要抹掉的复数的索引noised_indices = np.where(freqs != fund_freq)# 复制一个复数数组的副本,避免污染原始数据filter_complex_array = complex_array.copy()filter_complex_array[noised_indices] = 0filter_pows = np.abs(filter_complex_array)plt.subplot(224)plt.xlabel('Frequency', fontsize=12)plt.ylabel('Power', fontsize=12)plt.tick_params(labelsize=10)plt.grid(linestyle=':')plt.plot(freqs[freqs >= 0], filter_pows[freqs >= 0], c='dodgerblue', label='Filter')plt.legend()

  4、基于逆向傅里叶变换,生成新的音频信号,绘制音频时域的:时间/位移图像

filter_sigs = nf.ifft(filter_complex_array).realplt.subplot(223)plt.xlabel('Time', fontsize=12)plt.ylabel('Signal', fontsize=12)plt.tick_params(labelsize=10)plt.grid(linestyle=':')plt.plot(times[:178], filter_sigs[:178], c='hotpink', label='Filter')plt.legend()

  5、重新生成音频文件

# 生成音频文件wf.write('./da_data/filter.wav', sample_rate, filter_sigs)plt.show()离散傅里叶变换 (DFT)

  离散傅里叶变换(DFT)对有限长时域离散信号的频谱进行等间隔采样,频域函数被离散化了,便于信号的计算机处理。DFT的运算量太大,FFT是离散傅里叶变换的快速算法。

  说白了FFT和DFT它俩就是一个东东,只不过复杂度不同,

  有时候我们能够看到N点傅里叶变换,我个人理解是这个N点是信号前面N个连续的数值,即N点FFT意思就是截取前面N个信号进行FFT,这样就要求我们的前N个采样点必须包含当前信号的一个周期,不然提取的余弦波参数与正确的叠加波的参数相差很大。

  如果在N点FFT的时候,如果这N个采样点不包含一个周期呢?或者说我们的信号压根不是一个周期函数咋办?或者有一段是噪音数据呢?如果用FFT计算,就会对整体结果影响很大,然后就有人想通过局部来逼近整体,跟微积分的思想很像,将信号分成一小段一小段,然后对每一小段做FFT,就跟分段函数似的,无数个分段函数能逼近任意的曲线((⊙o⊙)…应该没错吧),这样每一段都不会互相影响到了。

二、短时傅里叶变换 (STFT)

  在短时傅里叶变换过程中,窗的长度决定频谱图的时间分辨率和频率分辨率,窗长越长,截取的信号越长,信号越长,傅里叶变换后频率分辨率越高,时间分辨率越差;相反,窗长越短,截取的信号就越短,频率分辨率越差,时间分辨率越好,也就是说短时傅里叶变换中,时间分辨率和频率分辨率之间不能兼得,应该根据具体需求进行取舍。

计算短时傅里叶变换,需要指定的有:

每个窗口的长度:nsc每相邻两个窗口的重叠率:nov每个窗口的FFT采样点数:nff

可以计算的有:

海明窗:w=hamming(nsc, 'periodic')信号被分成了多少片短时傅里叶变换:

python库librosa实现

librosa.stft(y, n_fft=2048, hop_length=None, win_length=None, window='hann', center=True, pad_mode='reflect')

短时傅立叶变换(STFT),返回一个复数矩阵使得D(f,t)

参数:

y:音频时间序列n_fft:FFT窗口大小,n_fft=hop_length+overlappinghop_length:帧移,如果未指定,则默认win_length / 4。win_length:每一帧音频都由window()加窗。窗长win_length,然后用零填充以匹配N_FFT。默认win_length=n_fft。window:字符串,元组,数字,函数 shape =(n_fft, )

窗口(字符串,元组或数字);窗函数,例如scipy.signal.hanning长度为n_fft的向量或数组center:bool

如果为True,则填充信号y,以使帧 D [:, t]以y [t * hop_length]为中心。如果为False,则D [:, t]从y [t * hop_length]开始dtype:D的复数值类型。默认值为64-bit complex复数pad_mode:如果center = True,则在信号的边缘使用填充模式。默认情况下,STFT使用reflection padding。

返回:

STFT矩阵D,shape =(1 + nfft2,t)librosa.magphase(D, power=1)

将复值频谱D分离成其幅度(S)和相位(P)

参数:

D:复值谱图,np.ndarray [shape =(d,t),dtype = complex]power:幅度谱图的指数,例如,1代表能量,2代表功率,等等。

返回:

D_mag :D的幅值,np.ndarray [shape =(d,t),dtype = real]D_phase :D的相位,np.ndarray [shape =(d,t),dtype = complex],exp(1.j * phi)其中phi是D的相位y, _ = librosa.load("p225_002.wav", sr=16000)D = librosa.stft(y, n_fft=2048, hop_length=None, win_length=None, window='hann', center=True, pad_mode='reflect')print(D.shape) # (1025, 127)# 将复值频谱D分离成其幅度(S)和相位(P)的部件magnitude, phase = librosa.magphase(D, power=1)# magnitude # 赋值 [shape =(d,t),dtype = real] (1025, 127)# phase.shape # 相位 [shape =(d,t),dtype = complex] (1025, 127) angle = np.angle(phase) # 获取相角(以弧度为单位)

tensorflow实现

一句话实现分帧、加窗、STFT变换

# [batch_size, signal_length]. batch_size and signal_length 可能会不知道signals = tf.placeholder(tf.float32, [None, None])# `stfts` 短时傅里叶变换:就是对信号中每一帧信号进行傅里叶变换 # shape is [batch_size, ?, fft_unique_bins]# 其中 fft_unique_bins = fft_length // 2 + 1 = 513.stfts = tf.contrib.signal.stft(signals, frame_length=1024, frame_step=512, fft_length=1024)

wlen:窗长

frame_length是信号中帧的长度

frame_step是帧移

fft_length:做fft变换的长度,或一种说话:fft变换所取得N点数,在有些地方也表示为NFFT。

注意:FFT的长度必须大于或者等于win的长度或者帧长。以获得更高的频域分辨率

FFT后的分辨率(频率的间隔)为fs/NFFT。当NFFT>wlen时就是在数据补零后做FFT,做的FFT得到的频谱等于以wlen长数据FFT的频谱中内插。

numpy库实现

上面的一行代码相当于下面一大段代码

 View Code

三、frequency bin

在读paper的时候总是会遇到 frequency bin (频率窗口)这个词,

  frequency bin 是指:raw data 经过FFT后得到的频谱图(频域率)中,频率轴的频率间隔或分辨率,通常取决采样率和采样点。

采样率采样点数frequencybin=采样率采样点数=fsampleNrecode

  Nrecode  是信号在时域的采样点数,频谱中的频率点或线的数量为Nrecode2  (奈奎斯特采样定理)

  频谱的第一个频点始终为直流(频率=0),最后一个频点为fsample2−fsampleNrecode  。频点采用相等的间隔,这间隔通常用frequency bin(频率窗口)或FFT bin表示。

例子1:我们可以作用82MHz的采样频率,取得8200个数据记录,frequency bin=820000008200=10000=10kHz。

例子2:frequency bin是频率域中采样点之间的间隔。例如,如果采样率为100赫兹,FFT为100个点,frequency bin=1,则在[0 100)赫兹之间有100个点。因此,您将整个100赫兹范围划分为100个间隔,如0-1赫兹、1-2赫兹等。每一个如此小的间隔,比如0-1Hz,都是一个frequency bin(频率箱)。

本文链接地址:https://www.jiuchutong.com/zhishi/298585.html 转载请保留说明!

上一篇:『前端必备』本地数据接口—json-server 详细介绍(入门篇)(前端必会)

下一篇:强化学习之stable_baseline3详细说明和各项功能的使用

  • 三星i929评测(三星i929论坛)(三星i927)

    三星i929评测(三星i929论坛)(三星i927)

  • ipad第八代是2020吗(ipad第八代是2020还是2018啊)

    ipad第八代是2020吗(ipad第八代是2020还是2018啊)

  • 抖音极速版怎么开直播(抖音极速版怎么不能提到支付宝了)

    抖音极速版怎么开直播(抖音极速版怎么不能提到支付宝了)

  • 支付宝红包过期了能看到金额吗(支付宝红包过期了 钱到哪去了呢)

    支付宝红包过期了能看到金额吗(支付宝红包过期了 钱到哪去了呢)

  • vivo熄屏幕显示时间怎么设置(vivo息屏怎么不显示)

    vivo熄屏幕显示时间怎么设置(vivo息屏怎么不显示)

  • 含有ctrl的快捷方式(ctrl的所有快捷功能)

    含有ctrl的快捷方式(ctrl的所有快捷功能)

  • 手机的重量一般多少克(手机的重量一般是多少g)

    手机的重量一般多少克(手机的重量一般是多少g)

  • 华为nova7多大尺寸(华为nova7手机尺寸多大)

    华为nova7多大尺寸(华为nova7手机尺寸多大)

  • 怎样将好友移出群(怎么看删除的好友)

    怎样将好友移出群(怎么看删除的好友)

  • 快手发作品最佳时间是什么时候?(快手发作品最佳上时间黄金)

    快手发作品最佳时间是什么时候?(快手发作品最佳上时间黄金)

  • caps键是什么意思(caps键是什么意思什么功能)

    caps键是什么意思(caps键是什么意思什么功能)

  • 为什么微信同步不了qq(为什么微信同步不了)

    为什么微信同步不了qq(为什么微信同步不了)

  • 集线器工作在osi哪一层(集线器工作在osi七层中的哪一层)

    集线器工作在osi哪一层(集线器工作在osi七层中的哪一层)

  • 信息网主要划分为(信息网主要划分为什么)

    信息网主要划分为(信息网主要划分为什么)

  • 小米cc9nfc感应区在哪里(小米9senfc感应区)

    小米cc9nfc感应区在哪里(小米9senfc感应区)

  • cpu和显卡有什么区别(cpu和显卡有什么用)

    cpu和显卡有什么区别(cpu和显卡有什么用)

  • ipada1432是ipad几(ipada1432是几代,现在值多少钱?)

    ipada1432是ipad几(ipada1432是几代,现在值多少钱?)

  • 在快手极速版上买的东西在哪里可以查看(在快手极速版上怎样赚钱)

    在快手极速版上买的东西在哪里可以查看(在快手极速版上怎样赚钱)

  • 手机自动联网怎么解决(手机自动联网怎么回事)

    手机自动联网怎么解决(手机自动联网怎么回事)

  • 手机淘宝旺旺发不出去消息(手机淘宝旺旺发的视频在哪里)

    手机淘宝旺旺发不出去消息(手机淘宝旺旺发的视频在哪里)

  • 微信静音播放怎么取消(微信静音播放怎么恢复声音)

    微信静音播放怎么取消(微信静音播放怎么恢复声音)

  • 如何开启华为移动服务(我如何开启华为移动的所有东西?)

    如何开启华为移动服务(我如何开启华为移动的所有东西?)

  • 去哪儿怎么取消优惠套餐(去哪儿怎么取消退票保障)

    去哪儿怎么取消优惠套餐(去哪儿怎么取消退票保障)

  • iphone8跑分多少正常

    iphone8跑分多少正常

  • 三星9650是什么型号(三星9650是什么手机)

    三星9650是什么型号(三星9650是什么手机)

  • vivox27如何设置人脸识别(vivox27如何设置动态壁纸)

    vivox27如何设置人脸识别(vivox27如何设置动态壁纸)

  • 如何自己制作视频(如何自己制作视频教程)

    如何自己制作视频(如何自己制作视频教程)

  • 如何在Win10专业版上为Wi-Fi启用随机MAC地址(windows10专业)

    如何在Win10专业版上为Wi-Fi启用随机MAC地址(windows10专业)

  • 深度学习&故障诊断初学者 - 学习路线

    深度学习&故障诊断初学者 - 学习路线

  • 本年利润怎么结转分录
  • 待处理财产损益借方
  • 小规模简易征收计算方法
  • 项目差旅费能计入项目费用吗
  • 通行费发票抵扣要勾选认证吗
  • 无发票入账违反哪条法律
  • 购买的二手车可以抵扣进项税额吗
  • 生产企业出口货物会计分录
  • 债券置换债务
  • 进项税未抵扣完怎么结转
  • 房产折旧计算方法 举例
  • 财务报表分析方法有
  • 政府补助款提现流程
  • 劳务发票税率营改增后是多少?
  • 一般纳税人只交进项税吗
  • 固定资产更换配件怎么界定是否满足资本化
  • 半成品成本核算 一般企业怎么核算
  • 购入的苗木种植一段时间后再销售要交增值税吗?
  • 财务报告财务报表年度报告的区别
  • 营改增后发票报销管理规定是怎样的?
  • 房租合同印花税的计税依据怎么算
  • 稿酬所得个人所得税税率
  • 开具发票超出企业经营范围属于虚开发票吗??
  • 发票后附的销售清单怎么黏
  • 销售换货怎么做账务处理
  • 结构化存款是什么
  • 装修预付款怎么做账
  • 撤回投资属于什么会计科目
  • 政府补贴冲减资产原值
  • 计提减值准备怎么计算?
  • 软件进项税额分摊方式
  • 递延资产主要包括哪些
  • 在edge浏览器中打开农行K宝
  • 固定资产的折旧是什么意思
  • 如何加快身体的新陈代谢
  • win7系统为什么没有无线网络连接
  • hyper-v虚拟机中重置虚拟机是什么意思
  • Win10 19043.1237 9月累积更新 KB5005565推送(附更新修复+下载)
  • 如何修复win10开机转圈五分钟
  • 共用水电无法取水怎么办
  • 出口零退税率商品有哪些
  • 公共基础设施的英语
  • uniapp打包成h5如何调用原生
  • vue写的购物车详细步骤
  • transformer add norm
  • 电子回单是什么样子
  • 增值税普通发票和电子普通发票的区别
  • 税控盘没交年费会怎么办
  • 逐步结转分步法的步骤
  • 分期付款的消费税怎么计算
  • 全年一次性奖金单独计税还是并入
  • 已核准未登记名称我可以注册吗
  • 融资租赁租出的固定资产账务处理
  • 不动产登记机构应当履行下列职责?
  • 小规模购进商品怎么做账
  • 以固定资产换入库存商品
  • 商业承兑汇票的风险
  • 其它权益工具投资和其他债权投资
  • 企业取得租车发票
  • 企业会计制度对固定资产无入账价值怎么入账
  • 代缴社保会计分录
  • 什么是一般生产要素
  • 企业开发有多个产品
  • 购买方账务处理
  • 未分配利润借方是什么意思
  • centosgui
  • xp系统蓝屏解决
  • xp系统的程序和功能在哪里
  • centos etc
  • win7系统屏幕保护设置禁用如何开启
  • appiumforwindows的简单安装和启动(安卓)
  • django 不同app间model引用
  • javascript语法术语
  • ajax里面的属性
  • 用简单的方法做好玩的手工视频教程
  • jquery.cookie.js实现用户登录保存密码功能的方法
  • 10月份税务申报
  • 深圳土地增值税清算规程
  • 销货清单表格的制作方法
  • 徐州注销营业执照去哪里
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设