python计算平均绝对误差,python预测值和真实值
SciPy提供了fftpack模块,包括傅立叶变换的算法实现。
傅立叶变换将信号从时域变换到频域,以便对信号进行处理。傅立叶变换已经广泛应用于信号与噪声处理、图像处理、音频信号处理等领域。
如果需要了解更多傅里叶变换的原理,可以参考相关资料。
快速傅里叶变换
计算机只能处理离散信号,使用离散傅里叶变换(DFT)是计算机分析信号的基本方法。而离散傅里叶变换的缺点是:计算量大,时间复杂度太高,采样点数过多时计算速度慢,这就导致了DFT的快速实现,即快速傅里叶变换FFT。
快速傅立叶变换(FFT)是一种计算量较小的离散傅立叶变换的实现方法,其逆变换称为快速傅立叶逆变换(IFFT)。
例子
首先对数据进行fft变换,然后进行逆ifft变换。
Importnumpy as np#从fftpack导入fft(快速傅立叶变换)和ifft(快速傅立叶逆变换)函数。
从scipy.fftpackimport FFT,IFFT #创建一个随机值数组
X=NP。array ([1.0,2.0,1.0,-1.0,1.5]) #傅里叶变换数组数据
y=FFT(x)print( FFT:)print(y)print( \ n )#快速傅立叶逆变换
yinv=IFFT(y)print( IFFT:)print(yinv)print( \ n )
输出
fft:
这是一个很好的例子。46660.66666666661
1.60822041j 2.0815876j]
ifft:
[1.0.j 2。0.j 1。0.j -1。0.j 1.5 0.j]
你可以看到fft,ifft返回复数。ifft返回的结果中,复数的虚部都是0,实部与原始数据x一致。
因为没有设置这n个点的时间长度,所以无法计算这些点的频率。不懂就不要深究。后面我们会介绍。
理解fft变换结果
我们知道,傅里叶变换是将时域信号变换成频域信号。在离散傅里叶变换中,频域信号由一系列不同频率(频率的倍数)的谐波组成。fft的返回值是一个复数数组,每个复数代表一个正弦波。通常,一个波形由三个变量决定:幅度、相位和频率,这些变量可以从fft的返回值中获得。
假设A为时域周期信号,采样频率为Fs,采样点数为N,若A[N]=fft(a[N]),返回值A[N]为复数数组,其中:
[0]表示频率为0hz的信号,即DC分量。
A[1:N/2]包含正频率项,A[N/2:]包含负频率项。正频率项是转换后的频域信号。通常我们只需要正频项,也就是前面的n/2项,负频项是计算的中间结果(正频项的镜像值)。
各项频率的计算:设A[i]是数组中的一个元素,代表一个波形,波形的频率=I * fs/n。
A[i]=实数j * imag,是一个复数。相位是复数的自变量,相位=arg(real/imag)
同样,振幅是复数的模,振幅=sqrt(real^2 imag^2 2)。但是fft的返回值的模是放大值,DC分量的幅度被放大N倍,和弦波分量的幅度被放大N/2倍。
频率分解
频率分辨率是DFT频域中相邻尺度之间的实际频率之差。采样时,数据采样T秒(T=采样点数N/采样频率Fs),信号分量的最长周期为T秒,最低频率即“基频”等于1/T,即Fs/N,即频率分辨率。基频=Fs/N,各次谐波的频率为I * fs/n,这个公式用来计算各波形的频率。
例子
将numpy作为NP从scipy.fftpack导入FFT #采样点
N=4000
#采样频率(根据采样定理,采样频率必须大于信号最高频率的2倍,这样信号才不会失真)
FS=8000x=NP。Linspace (0.0,n/FS,n) #时域信号,包括:DC分量幅度1.0,正弦波分量频率100hz/幅度2.0,正弦波分量频率150Hz/幅度0.5/相位np.pi
y=1 . 02 . 0 * NP . sin(100.0 * 2.0 * NP . pi * x)0.5 * NP . sin(150.0 * 2.0 * NP . pi * x NP . pi)#用于fft变换。
Yf=f
Print(\n DC信号)Print(振幅:,ABS _ YF[0]/N)# DC分量的振幅被放大N倍。
# 100赫兹信号
Index_100hz=100 * N //Fs #波形频率=i * Fs/N,反算index: i=波形频率* N/Fs
Print( N 100hz波形)print(振幅:,abs_yf[index_100hz] * 2.0/N) #正弦波分量的振幅被放大N/2倍。
打印( phase:,angle_y[index_100hz])#150hz信号
Index_150hz=150 * N //Fs #波形频率=i * Fs/N,反算index: i=波形频率* N/Fs
Print( N 150hz波形)print(振幅:,abs_yf[index_150hz] * 2.0/N) #正弦波分量的振幅被放大N/2倍。
Print (phase:,angle _ y[index _ 150hz])print( 100hz和150hz之间的相位差:,angle _ y[index _ 150hz]-angle _ y[index _ 100hz])print( \ n )
输出
直流信号
振幅:1.0100赫兹波形
振幅:1.99835813189005相位:-1。150赫兹的波形。38860 . 68686868686
振幅:0.500848983048182相位:1。150赫兹和100赫兹之间的相位差:15000.688686868617
可以看出,正弦波的相位不一定从0开始,但波形之间的相位差确实约等于一个(数值与采样频率和采样点数有关)。
离散余弦变换
由于要处理的信号很多是实信号,所以在使用FFT时,傅立叶变换的共轭对称性导致频域有一半的数据冗余。
离散余弦变换是一种由实信号定义的变换。经过变换后,在频域中也获得了真实信号。与离散傅里叶变换(DFT)相比,DCT可以减少一半以上的计算量。DCT还有一个很重要的性质(能量集中):绝大多数自然信号(声音和图像)的能量都集中在DCT后的低频部分,所以DCT广泛应用于数据压缩(声音和图像)。因为DCT是从DFT派生出来的另一种变换,所以DFT的很多属性都保留在DCT中。
SciPy.fftpack提供离散余弦变换(DCT)和反离散余弦变换(IDCT)的实现。
例子
import numpy as NP from scipy . FFT pack import DCT,idct
y=dct(np.array([4。 3. 5. 10. 5. 3.]))打印(y)
输出
[ 60.-3.48476592 -13.85640646 11.3137085 6.-6.31319305]
逆离散余弦变换(idct)是离散余弦变换(dct)的逆变换。
例子
import numpy as NP from scipy . FFT pack import DCT,idct
y=idct(np.array([4。 3. 5. 10. 5. 3.]))打印(y)
输出
[ 39.15085889 -20.14213562 -6.45392043 7.13341236 8.14213562
-3.83035081]
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。