摘要:通過Python實現WAV音頻信號處理與線性回歸建模,揭示雙聲道音頻的數學關聯性,為聲音特征分析提供新視角。
1. 音頻數據處理流程
1.1 WAV文件讀取與預處理
使用scipy.io.wavfile
讀取音頻文件,獲取采樣率與時域信號數據:
from scipy.io import wavfile
sample_rate, audio_data = wavfile.read("sound/cat/1-47819-C-5.wav")
- 自動識別單聲道/立體聲:單聲道返回一維數組,立體聲返回二維數組(左/右聲道)
- 關鍵指標:采樣率(Hz)、數據類型(如int16)、數據形狀(樣本數×聲道數)
1.2 聲道分離與標準化
# 立體聲分離
left_channel = audio_data[:, 0]
right_channel = audio_data[:, 1]# 標準化(均值歸零、方差歸一)
left_norm = (left_channel - np.mean(left_channel)) / np.std(left_channel)
right_norm = (right_channel - np.mean(right_channel)) / np.std(right_channel)
標準化消除量綱差異,提升模型收斂效率。
2. 線性回歸建模核心
2.1 回歸參數計算
基于最小二乘法直接求解斜率與截距:
def linear_regression(x, y):n = len(x)sum_x, sum_y = np.sum(x), np.sum(y)sum_xy = np.sum(x * y)sum_x2 = np.sum(x ** 2)slope = (n * sum_xy - sum_x * sum_y) / (n * sum_x2 - sum_x ** 2)intercept = (sum_y - slope * sum_x) / nreturn slope, intercept
該方法避免迭代計算,效率顯著高于梯度下降法。
2.2 滑動窗口分塊分析
sim_list = []
for i in range(0, len(left_norm)-800, 800):x = left_norm[i:i+800:2] # 左聲道隔點采樣y = right_norm[i:i+800:1] # 右聲道連續采樣slope, intercept = linear_regression(x, y)y_pred = slope * x + interceptsim = cosine_similarity(y_pred, y) # 余弦相似度評估擬合效果sim_list.append(sim)
- 創新點:通過800樣本滑動窗口捕捉局部特征
- 輸出指標:各窗口回歸方程的余弦相似度序列
3. 模型評估與可視化
3.1 誤差指標計算
def calculate_fit_error(y_true, y_pred):mse = np.mean((y_true - y_pred) ** 2) # 均方誤差rmse = np.sqrt(mse) # 均方根誤差mae = np.mean(np.abs(y_true - y_pred)) # 平均絕對誤差return mse, rmse, mae
多維度評估模型精度。
3.2 動態效果可視化
plt.figure(figsize=(12, 4))
plt.plot(sim_list, marker='o', linestyle='-', color='#FF7043')
plt.title("雙聲道線性擬合相似度變化趨勢", fontsize=14)
plt.xlabel("時間窗口索引", fontsize=12)
plt.ylabel("余弦相似度", fontsize=12)
plt.grid(alpha=0.3)
plt.show()
4. 完整代碼實現
import numpy as np
import matplotlib.pyplot as plt
from scipy.io import wavfile# 中文顯示支持
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']
plt.rcParams['axes.unicode_minus'] = Falsedef cosine_similarity(a, b):"""計算余弦相似度"""return np.dot(a, b) / (np.linalg.norm(a) * np.linalg.norm(b))def linear_regression(x, y):"""最小二乘法線性回歸"""n = len(x)sum_x, sum_y = np.sum(x), np.sum(y)sum_xy = np.sum(x * y)sum_x2 = np.sum(x ** 2)slope = (n * sum_xy - sum_x * sum_y) / (n * sum_x2 - sum_x ** 2)intercept = (sum_y - slope * sum_x) / nreturn slope, interceptdef main():# 數據讀取_, audio = wavfile.read("sound/cat/1-47819-C-5.wav")left = (audio[:,0]-np.mean(audio[:,0]))/np.std(audio[:,0])right = (audio[:,1]-np.mean(audio[:,1]))/np.std(audio[:,1])# 滑動窗口分析sim_list = []for i in range(0, len(left)-800, 800):x, y = left[i:i+800:2], right[i:i+800:1]if len(x) > len(y): x = x[:len(y)]slope, intercept = linear_regression(x, y)sim_list.append(cosine_similarity(slope*x+intercept, y))# 可視化plt.plot(sim_list)plt.show()if __name__ == "__main__":main()
5. 應用場景與擴展
-
聲音特征分析
通過回歸斜率變化識別音頻中的突發事件(如爆破音、重音節) -
音頻質量評估
雙聲道擬合相似度越高,說明聲道一致性越好(適用于設備測試) -
擴展方向
- 引入MFCC(梅爾頻率倒譜系數)替代原始信號
- 結合LSTM模型捕捉長期依賴關系
- 遷移至帕金森病語音診斷等醫療場景
參考文獻:
- https://blog.csdn.net/weixin_43881394/article/details/105680975
- https://blog.csdn.net/bifengmiaozhuan/article/details/142349833
- https://docs.pingcode.com/ask/971413.html
源碼下載與實時演示可訪問 [GitHub項目鏈接]