產生sine wave 波型與聲音
產生sine wave 波型與聲音
Example Code
- import wave
- import numpy as np
- import matplotlib.pyplot as plt
- time = 1 # second 聲音播放時間
- framerate = 44100 # 聲音取樣率
- nframes = time * framerate # 多少個數據點
- n = np.arange(0, time, 1/framerate) #產生播放時間內的時間軸數列
- f_Do =262 # Hz # Do 的頻率; f_Mi =330 # Hz; f_Sol =392 # Hz ;f_HDo =523 # Hz
- sinus_f_Do = np.sin(2*np.pi*f_Do*n) #以sine wave產生波型數據, 產生t秒 44.1kHz取樣率音高是Do的 sine wave
- #sinus_f_Do = np.append(sinus_f_Do, sinus_f_Mi) #新增sine wave波型數據, 新產生t秒 44.1kHz取樣率音高是Mi的 sine wave, 並合併資料
- #sinus_f_Do = np.append(sinus_f_Do, sinus_f_Sol) #新增sine wave波型數據, 新產生t秒 44.1kHz取樣率音高是Sol的 sine wave, 並合併資料
- #sinus_f_Do = np.append(sinus_f_Do, sinus_f_HDo) #新增sine wave波型數據, 新產生t秒 44.1kHz取樣率音高是High Do的 sine wave, 並合併資料
- # 先放大以免轉換 np.short 為 0,並且聲音過大或過小, 在此我先歸一化聲波的振幅爲10000,(請由小數值測試起, 以免喇叭損壞)
- volume = max([sinus_f_Do.max(), -sinus_f_Do.min()])
- volumeLimit = 10000/volume
- wave_data = sinus_f_Do * volumeLimit
- wave_data = wave_data.astype(np.short)
- # 寫入檔案
- f = wave.open(r"sweepDoMiSol.wav", "wb")
- # 設定聲道數、sample 大小(byte) 和取樣頻率
- f.setnchannels(1)
- f.setsampwidth(2)
- f.setframerate(framerate)
- # 寫入波形數據
- f.writeframes(wave_data.tostring())
- f.close()
Note and Comments
result
畫出上例的 262Hz sine wave
畫出上例的 262Hz sine wave
Example Code
- import numpy as np
- import matplotlib.pyplot as plt
- import matplotlib.pyplot as plt;
- plt.plot(n[0:300], sinus_f_Do[0:300]);
- plt.show()
Note and Comments
result
畫出上例的 262Hz sine wave 與Mi
畫出上例的 sine wave
Example Code
- import numpy as np;
- import matplotlib.pyplot as plt;
- sinus_f_Do = np.sin(2*np.pi*f_Do*n)
- plt.plot(n[0:800], sinus_f_Do[0:800],'--');
- f_Mi =330
- sinus_f_Mi = np.sin(2*np.pi*f_Mi*n)
- plt.plot(n[0:800], sinus_f_Mi[0:800],'--');
- sinus_f_Do=sinus_f_Do+sinus_f_Mi
- volume = max([sinus_f_Do.max(), -sinus_f_Do.min()])
- volumeLimit = 1/volume
- sinus_f_Do=sinus_f_Do*volumeLimit
- plt.plot(n[0:800], sinus_f_Do[0:800]);
- plt.legend(['Do 262 Hz','Mi','Do + Mi'])
- plt.show()
Note and Comments
result
畫出上例的 Do, Mi, & Sol
畫出上例的 Do, Mi, & Sol
Example Code
- import numpy as np;
- import matplotlib.pyplot as plt;
- sinus_f_Do = np.sin(2*np.pi*f_Do*n)
- plt.plot(n[0:1200], sinus_f_Do[0:1200],'--');
- f_Mi =330
- f_Sol =392
- sinus_f_Do=sinus_f_Do +np.sin(2*np.pi*f_Mi*n) +np.sin(2*np.pi*f_Sol*n)
- volume = max([sinus_f_Do.max(), -sinus_f_Do.min()])
- volumeLimit = 1/volume
- sinus_f_Do=sinus_f_Do*volumeLimit
- plt.plot(n[0:1200], sinus_f_Do[0:1200],'r');
- plt.legend(['Do 262 Hz','Do + Mi + Sol'])
- plt.show()
Note and Comments
result