python生成任意频率正弦波方式
如下所示:
defsignal_xHz(A,fi,time_s,sample):
returnA*np.sin(np.linspace(0,fi*time_s*2*np.pi,sample*time_s))
A:为信号幅值
fi:为信号频率
time_s:为时间长度(s)
sample:为信号采样频率
补充拓展:PythonFFT合成波形实例
使用Pythonnumpy模块带的FFT函数合成矩形波和方波,增加对离散傅里叶变换的理解。
导入模块
importnumpyasnp importmatplotlib.pyplotasplt 分别是产生一个周期的方波和三角波程序 #产生size点取样的三角波,其周期为1 deftriangle_wave(size): x=np.arange(0,1,1.0/size) y=np.where(x<0.5,x,0) y=np.where(x>=0.5,1-x,y) returnx,y defsquare_wave(size): x=np.arange(0,1,1.0/size) y=np.where(x<0.5,1.0,0) returnx,y
其中np.where函数第二个值是if,第三个是else
下面程序可以计算对应的频谱,采样点数取为2的n次幂是为了便于FFT计算
fft_size=256 #计算三角波和其FFT x,y=triangle_wave(fft_size) fy=np.fft.fft(y)/fft_size
下面对计算的频谱进行可视化,频率对应的强度使用工程上常用的分贝dp来表示
#绘制三角波的FFT的前20项的振幅,由于不含下标为偶数的值均为0,因此取 #log之后无穷小,无法绘图,用np.clip函数设置数组值的上下限,保证绘图正确 plt.figure() plt.plot(np.clip(20*np.log10(np.abs(fy[:20])),-120,120),"o") plt.xlabel("frequencybin") plt.ylabel("power(dB)") plt.title("FFTresultoftrianglewave")
下面用正弦和余弦函数合成信号
#取FFT计算的结果freqs中的前n项进行合成,返回合成结果,计算loops个周期的波形 deffft_combine(freqs,n,loops=1): length=len(freqs)*loops data=np.zeros(length) index=loops*np.arange(0,length,1.0)/length*(2*np.pi) fork,pinenumerate(freqs[:n]): ifk!=0:p*=2#除去直流成分之外,其余的系数都*2 data+=np.real(p)*np.cos(k*index)#余弦成分的系数为实数部 data-=np.imag(p)*np.sin(k*index)#正弦成分的系数为负的虚数部 returnindex,data
其中index代表频谱空间的采样点
画出合成信号,x坐标使用默认的整数表示即可
#绘制原始的三角波和用正弦波逐级合成的结果,使用取样点为x轴坐标 plt.figure() plt.plot(y,label="originaltriangle",linewidth=2) foriin[0,1,3,5,7,9]: index,data=fft_combine(fy,i+1,2)#计算两个周期的合成波形 plt.plot(data,label="N=%s"%i) plt.legend() plt.title("partialFourierseriesoftrianglewave") plt.show()
以上这篇python生成任意频率正弦波方式就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。