当前位置:   article > 正文

用Python简单的实现AM调制信号波形的变化_用python简单的实现am的调制信号波形变化

用python简单的实现am的调制信号波形变化
  1. import numpy as np
  2. from numpy import pi
  3. import matplotlib.pyplot as plt
  4. from matplotlib.pylab import mpl
  5. mpl.rcParams['font.sans-serif'] = ['SimHei']
  6. mpl.rcParams['font.sans-serif'] = ['SimHei']
  7. sample_rate = 22050 #采样率
  8. time = 5 #波形时间
  9. def wave_bulid(f0,amplitude_xishu = 1):#波形生成
  10. w_oumiga = 2*pi*f0
  11. x = np.linspace(0,time,sample_rate*time)
  12. y = amplitude_xishu*np.cos(w_oumiga*x)
  13. return x,y,f0
  14. def to_fft(data,N=sample_rate*time):#转换为频域数据,并进行取半、归一化等处理
  15. # N=self.nframes #取样点数
  16. df = sample_rate/ (N - 1) #每个点分割的频率 如果你采样频率是4096,你FFT以后频谱是从-2048到+2048hz(4096除以2),然后你的1024个点均匀分布,相当于4个HZ你有一个点,那个复数的模就对应了频谱上的高度
  17. freq = [df * n for n in range(0, N)]
  18. wave_data2 = data[0:N]
  19. fft_int=np.fft.fft(wave_data2)
  20. # print(N, len(data),len(wave_data2))
  21. c = fft_int * 2 / N #*2能量集中化 /N归一化
  22. d = int(len(c) / 2) #对称取半
  23. freq=freq[:d - 1]
  24. fredata=abs(c[:d - 1])
  25. return freq,fredata
  26. def wave_filter(y_data,fre_min = 0,fre_max = 11025,sample_rate = 22050,time = 5):#滤波函数
  27. if fre_max > sample_rate/2:
  28. fre_max = sample_rate/2
  29. N = int(sample_rate * time)
  30. freq = np.linspace(0, sample_rate, N)
  31. ft_y = np.fft.fft(y_data)
  32. n1 = np.array(np.where(freq <= fre_min)).max()
  33. n2 = np.array(np.where(freq >= fre_max)).min()
  34. ft_y[n1:n2] = 0 + 0j
  35. ft_y[-n2:-n1] = 0 + 0j
  36. y_new = np.fft.ifft(ft_y)
  37. return y_new
  38. def wave_all(f0):#生成时域+频域波形
  39. x, y, f0 = wave_bulid(f0)
  40. fre_x, fre_y = to_fft(y)
  41. str_data = "y = cos(2Pi*"+str(f0)+"*t)"
  42. return x,y,fre_x,fre_y,str_data
  43. #*******生成两个信号*******
  44. f0 = [2,30]#调制信号,载波信号频率
  45. str_title=["调制信号","载波"]
  46. plt.figure(figsize=(16, 10))
  47. y3 = 1
  48. for i in range(0,len(f0)):#生成f0中两个波形
  49. x, y, fre_x, fre_y, str_data = wave_all(f0[i])
  50. y3 *= y#调制后的信号
  51. plt.subplot(5, 2, i*2+1)
  52. plt.title(str_title[i],fontdict={'weight':'normal','size': 10})
  53. # plt.xlabel(u"Time(S)")
  54. plt.plot(x, y)
  55. plt.subplot(5, 2, i*2+2)
  56. # plt.title(str_data+"频域",fontdict={'weight':'normal','size': 10})
  57. # plt.xlabel(u"Frequency")
  58. plt.plot(fre_x, fre_y)
  59. plt.xlim(0, f0[1]*1.5)
  60. #*******AM调制后的波形*******
  61. fre_x, fre_y = to_fft(y3)
  62. plt.subplot(5, 2, 5)
  63. plt.title("AM已调波",fontdict={'weight':'normal','size': 10})
  64. # plt.xlabel(u"Time(S)")
  65. plt.plot(x, y3)
  66. plt.subplot(5, 2, 6)
  67. # plt.title("AM Frc")
  68. # plt.xlabel(u"Frequency")
  69. plt.plot(fre_x, fre_y)
  70. plt.xlim(0, f0[1]*1.5)
  71. #*******同步检波后的波形********
  72. y4 = y3*wave_bulid(f0[1])[1]
  73. fre_x4, fre_y4 = to_fft(y4)
  74. plt.subplot(5, 2, 7)
  75. plt.title("AM同步检波",fontdict={'weight':'normal','size': 10})
  76. # plt.xlabel(u"Time(S)")
  77. plt.plot(x, y4)
  78. plt.subplot(5, 2, 8)
  79. # plt.title("AM Frc")
  80. # plt.xlabel(u"Frequency")
  81. plt.plot(fre_x4, fre_y4)
  82. plt.xlim(0, f0[1]*2.5)
  83. #*******滤波后的波形*******
  84. y5 = wave_filter(y4,9,)
  85. fre_x5, fre_y5 = to_fft(y5)
  86. plt.subplot(5, 2, 9)
  87. plt.title("滤波后信号",fontdict={'weight':'normal','size': 10})
  88. # plt.xlabel(u"Time(S)")
  89. plt.plot(x, y5)
  90. plt.subplot(5, 2, 10)
  91. # plt.title("AM Frc")
  92. # plt.xlabel(u"Frequency")
  93. plt.plot(fre_x5, fre_y5)
  94. plt.xlim(0, f0[1]*2.5)
  95. # plt.subplots_adjust(hspace=0.4)
  96. plt.show()

运行后的波形:

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/95051
推荐阅读
相关标签
  

闽ICP备14008679号