python波形顯示
A. 在python 中打開波形文件 ︰ 未知的格式 ︰ 49.究竟怎麼了
投票
2
回答
1K
查看
我嘗試打開波形文件與 wave模塊,但是老是同樣的錯誤我試著不管。 包含錯誤的行是以下 ︰
wav = wave.open(f)
這是錯誤消息 ︰
Traceback (most recent call last):
File "annotate.py", line 47, in <mole>
play(file)
File "annotate.py", line 33, in play
wav = wave.open(f)
File "C:\Program Files (x86)\Python\lib\wave.py", line 498, in open
return Wave_read(f)
File "C:\Program Files (x86)\Python\lib\wave.py", line 163, in __init__
self.initfp(f)
File "C:\Program Files (x86)\Python\lib\wave.py", line 143, in initfp
self._read_fmt_chunk(chunk)
File "C:\Program Files (x86)\Python\lib\wave.py", line 269, in _read_fmt_chunk
raise Error('unknown format: %r' % (wFormatTag,))
wave.Error: unknown format: 49
字元串 f是路徑。WAV 文件,它工作在任何我的媒體播放器播放時。 我當然導入 wave的模塊。 我試過 f,作為一個相對和絕對路徑。 我試著用"wav"取代"WAV"。
錯誤什麼導致的?
投票
Python 的波模塊工作與特定類型的 WAV: PCM (WAVE_FORMAT_PCM: 0x0001)。
在您的情況下,您使用 WAV 類型 WAVE_FORMAT_GSM610[0x0031 = hex(49)].
你可以使用像大膽或者一些程序轉換的編解碼器,WAV 文件的類型更改為 lib。
B. 如何用Python顯示出一維波動方程的動態圖像
Python有一些繪圖的功能,使用turtle模塊。
在命令行輸入
python.exe -m turtledemo
可以打開Python安裝時,系統自帶的一些演示程序。
感覺功能還是比較多的。
程序實現其實還是比較簡單,主要是得搞懂倒是給的文獻,還得跟導師交流如何演示出效果。
C. Python科學計算——任意波形擬合
任意波形的生成 (geneartion of arbitrary waveform) 在商業,軍事等領域都有著重要的應用,諸如空間光通信 (free-space optics communication), 高速信號處理 (high-speed signal processing),雷達 (radar) 等。在任意波形生成後, 如何評估生成的任意波形 成為另外一個重要的話題。
假設有一組實驗數據,已知他們之間的函數關系:y=f(x),通過這些信息,需要確定函數中的一些參數項。例如,f 是一個線型函數 f(x)=k*x+b,那麼參數 k 和 b 就是需要確定的值。如果這些參數用 p 表示的話,那麼就需要找到一組 p 值使得如下公式中的 S 函數最小:
這種演算法被稱之為 最小二乘擬合 (least-square fitting)。scipy 中的子函數庫 optimize 已經提供實現最小二乘擬合演算法的函數 leastsq 。下面是 leastsq 函數導入的方式:
scipy.optimize.leastsq 使用方法
在 Python科學計算——Numpy.genfromtxt 一文中,使用 numpy.genfromtxt 對數字示波器採集的三角波數據導入進行了介紹,今天,就以 4GHz三角波 波形的擬合為案例介紹任意波形的擬合方法。
在 Python科學計算——如何構建模型? 一文中,討論了如何構建三角波模型。在標准三角波波形的基礎上添加了 橫向,縱向的平移和伸縮特徵參數 ,最後添加了 雜訊參數 模擬了三角波幅度參差不齊的隨機性特徵。但在波形擬合時,並不是所有的特徵參數都要納入考量,例如,雜訊參數應是 波形生成系統 的固有特徵,正因為它的存在使得產生的波形存在瑕疵,因此,在進行波形擬合並評估時,不應將雜訊參數納入考量,最終模型如下:
在調用 scipy.optimize.leastsq 函數時,需要構建誤差函數:
有時候,為了使圖片有更好的效果,需要對數據進行一些處理:
leastsq 調用方式如下:
合理的設置 p0 可以減少程序運行時間,因此,可以在運行一次程序後,用擬合後的相應數據對 p0 進行修正。
在對波形進行擬合後,調用 pylab 對擬合前後的數據進行可視化:
均方根誤差 (root mean square error) 是一個很好的評判標准,它是觀測值與真值偏差的平方和觀測次數n比值的平方根,在實際測量中,觀測次數n總是有限的,真值只能用最可信賴(最佳)值來代替.方根誤差對一組測量中的特大或特小誤差反映非常敏感,所以,均方根誤差能夠很好地反映出測量的精密度。
RMSE 用程序實現如下:
擬合效果,模型參數輸出:
leastsq 函數適用於任何波形的擬合,下面就來介紹一些常用的其他波形:
D. python plt.plot怎麼把圖顯示出來
1, 導入matplotlib.pyplot, numpy 包:
import numpy as np
import matplotlib.pyplot as plt
2,添加主題樣式:
plt.style.use('mystyle')
3, 設置圖的大小,添加子圖:
fig = plt.figure(figsize=(5,5))
ax = fig.add_subplot(111)
4,繪制sin, cos:
x = np.arange(-np.pi, np.pi, np.pi / 100)
y1 = np.sin(x)
y2 = np.cos(x)
sin, = ax.plot(x, y1, color='red', label='sin')
cos, = ax.plot(x, y2, color='blue', label='cos')
ax.set_ylim([-1.2, 1.2])
第二種方式 拆分顯示
sin_legend = ax.legend(handles=[sin], loc='upper right')
ax.add_artist(sin_legend)
ax.legend(handles=[cos], loc='lower right')
plt.show()
import numpy as np
import matplotlib.pyplot as plt
# 添加主題樣式
plt.style.use('mystyle')
# 設置圖的大小,添加子圖
fig = plt.figure(figsize=(5,5))
ax = fig.add_subplot(111)
for color in ['red', 'green']:
n = 750
x, y = np.random.rand(2, n)
scale = 200.0 * np.random.rand(n)
ax.scatter(x, y, c=color, s=scale,
label=color, alpha=0.3,
edgecolors='none')
ax.legend()
ax.grid(True)
plt.show()
E. 利用python掌握雷克子波製作
# -*- coding: UTF-8 -*-
import wave
import numpy as np
import matplotlib.pyplot as plt
# 打開wav文件 ,open返回一個的是一個Wave_read類的實例,通過調用它的方法讀取WAV文件的格式和數據。
f = wave.open(r"D:\project\REC001.wav","rb")
# 讀取格式信息
# 一次性返回所有的WAV文件的格式信息,它返回的是一個組元(tuple):聲道數, 量化位數(byte單位), 采
# 樣頻率, 采樣點數, 壓縮類型, 壓縮類型的描述。wave模塊只支持非壓縮的數據,因此可以忽略最後兩個信息
params = f.getparams()
[nchannels, sampwidth, framerate, nframes] = params[:4]
# 讀取波形數據
# 讀取聲音數據,傳遞一個參數指定需要讀取的長度(以取樣點為單位)
str_data = f.readframes(nframes)
f.close()
# 將波形數據轉換成數組
# 需要根據聲道數和量化單位,將讀取的二進制數據轉換為一個可以計算的數組
wave_data = np.fromstring(str_data,dtype = np.short)
# 將wave_data數組改為2列,行數自動匹配。在修改shape的屬性時,需使得數組的總長度不變。
wave_data.shape = -1,2
# 轉置數據
wave_data = wave_data.T
# 通過取樣點數和取樣頻率計算出每個取樣的時間。
time=np.arange(0,nframes/2)/framerate
# print(params)
plt.figure(1)
# time 也是一個數組,與wave_data[0]或wave_data[1]配對形成系列點坐標
plt.subplot(211)
plt.plot(time,wave_data[0])
plt.xlabel("time/s")
plt.title('Wave')
N=44100
start=0
# 開始采樣位置
df = framerate/(N-1)
# 解析度
freq = [df*n for n in range(0,N)]
# N個元素
wave_data2=wave_data[0][start:start+N]
c=np.fft.fft(wave_data2)*2/N
# 常規顯示采樣頻率一半的頻譜
plt.subplot(212)
plt.plot(freq[:round(len(freq)/2)],abs(c[:round(len(c)/2)]),'r')
plt.title('Freq')
plt.xlabel("Freq/Hz")
plt.show()
F. python畫正餘弦函數圖像
用python怎樣畫出如題所示的正餘弦函數圖像? 如此編寫代碼,使其中兩個軸、圖例、刻度,大小,LaTex公式等要素與原圖一致,需要用到的代碼如下,沒有縮進:
#-*-codeing:utf-8;-*-
from matplotlib import pyplot as plt
import numpy as np
a=np.linspace(0,360,980)
b=np.sin(a/180*np.pi)
c=np.cos(a/180*np.pi)
fig = plt.figure()
ax = fig.add_subplot(111)
ax.set_xlim([0, 360])
ax.plot(a,b,label=r"$y=sin( heta)$")
ax.plot(a,c,label=r"$y=cos( heta)$")
ax.grid(True)
ax.set_ylabel(r"$y$")
ax.set_xlabel(r"$ heta$")
plt.xticks(np.arange(0,360+1,45))
plt.title("Sine & Cosine Waves")
plt.legend()
plt.savefig("SinCosWaveDegFont.jpg")
plt.show()
代碼輸出的文件的圖