python fft 验证

# 所使用到的库函数
import numpy as np
import matplotlib.pyplot as plt
from scipy.fft import fft

# 简单定义一个FFT函数
def myfft(x,t):
    fft_x = fft(x)                                            #  fft计算
    amp_x = abs(fft_x)/len(x)*2                                 # 纵坐标变换
    label_x = np.linspace(0,int(len(x)/2)-1,int(len(x)/2))    # 生成频率坐标
    amp = amp_x[0:int(len(x)/2)]                              # 选取前半段计算结果即可
    # amp[0] = 0                                              # 可选择是否去除直流量信号
    fs =1/( t[2]-t[1])                                        # 计算采样频率
    print(fs)
    fre = label_x/len(x)*fs                                   # 频率坐标变换
    pha = np.unwrap(np.angle(fft_x))                          # 计算相位角并去除2pi跃变
    return amp,fre,pha                                        # 返回幅度和频率


t = np.linspace(0,256,256)                                # 时间坐标
x = np.sin(np.pi*t/10)                                         # 正弦函数

amp,fre,pha= myfft(x,t)                                       # 调用函数
# print(amp,fre,pha)
# 绘图
plt.figure()
plt.plot(t,x)
plt.title('Signal')
plt.xlabel('Time / s')
plt.ylabel('Intencity / cd')

plt.figure()
plt.plot(fre,amp)
plt.title('Amplitute-Frequence-Curve')
plt.ylabel('Amplitute / a.u.')
plt.xlabel('Frequence / Hz')
plt.show()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
频域采样定理指出,如果一个信号的最高频率为$f_m$,那么它的采样频率$f_s$必须满足$f_s \geq 2f_m$,才能在离散时间下恢复原始信号。因此,我们可以利用Python进行验证。 具体步骤如下: 1.生成一个频率为$f$的正弦波信号,其中$f$为信号的最高频率。 2.以采样频率$f_s$对信号进行采样,其中$f_s$小于$2f$。 3.将采样得到的信号进行离散傅里叶变换(DFT),得到频域信号。 4.将频域信号进行逆DFT,得到恢复后的信号。 5.比较原始信号和恢复后的信号,判断误差是否接近于0。 下面是Python代码示例: ```python import numpy as np import matplotlib.pyplot as plt # 生成一个频率为f的正弦波信号 f = 10 # 最高频率为10Hz t = np.linspace(0, 1, 1000) # 时间范围为0-1s,采样点数为1000 signal = np.sin(2 * np.pi * f * t) # 进行采样 fs = 15 # 采样频率为15Hz ts = np.arange(0, 1, 1 / fs) # 采样时间点 sampled_signal = np.sin(2 * np.pi * f * ts) # 进行DFT dft = np.fft.fft(sampled_signal) # 进行逆DFT recovered_signal = np.fft.ifft(dft) # 绘制原始信号和恢复后的信号 plt.plot(t, signal, label='Original Signal') plt.plot(ts, sampled_signal, 'o', label='Sampled Signal') plt.plot(t, recovered_signal.real, label='Recovered Signal') plt.legend() plt.show() # 计算误差 error = np.mean(np.abs(signal - recovered_signal.real)) print('误差为:', error) ``` 上述代码中,我们生成了一个频率为10Hz的正弦波信号,并以15Hz的采样频率进行采样。通过DFT和逆DFT操作,我们得到了恢复后的信号,并用图像比较了原始信号和恢复后的信号。最后,我们计算了误差并输出了结果。 如果误差足够小,则说明频域采样定理成立。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值