线性预测音频信号代码报错:'float' object is not subscriptable
线性预测音频信号频率响应代码的TypeError排查与解决
问题背景
编写原始音频信号的线性预测代码时,实现频率响应模块出现TypeError,核心代码及报错如下:
错误代码
omega = np.pi*m x_real = np.zeros(m) x_imaj = np.zeros(m) for i in range(0, int(m/2)): for j in range(1, t_lag): x_real[i] += inv_a[j]*np.cos(j*omega[i]) x_imaj[i] += inv_a[j]*np.sin(j*omega[i]) x_real[i] = 1-x_real[i] H_2 = 1/np.sqrt(x_real**2+x_imaj**2) #Frequency Response for Linear Prediction h_real = np.zeros(m) h_imaj = np.zeros(m) for i in range(0, int(m/2)): for j in range(1, t_lag): h_real[i] += a[j]*np.cos(j*omega[i]) h_imaj[i] += a[j]*np.sin(j*omega[i]) h_real[i] = 1-h_real[i] H_1 = 1/np.sqrt(h_real**2+h_imaj**2) #Plotting Frequency Response fig, ax = plt.subplots(figsize=(40,20)) ax.plot(H_1, color='red', label='A Omega') ax.plot(H_2, color='blue', label='H Omega') ax.set_title("Response Frequency",font="times new roman", size=55) ax5.set_xlabel('Ohm', fontsize='x-small') ax5.set_ylabel('Magnitude', fontsize='x-small') fig.tight_layout() ax.legend(fontsize=50) plt.show()
报错信息
TypeError Traceback (most recent call last) c:\Users\Armand S\Desktop\Python Biomodelling File\[FP BIOMOD]Linear Prediction_Armand Faris A Surbakti_5023201051.ipynb Cell 12 in <cell line: 8>() 8 for i in range(0, int(m/2)): 9 for j in range(1, t_lag): ---> 10 x_real[i] += inv_a[j]*np.cos(j*omega[i]) 11 x_imaj[i] += inv_a[j]*np.sin(j*omega[i]) 13 x_real[i] = 1-x_real[i] TypeError: 'float' object is not subscriptable
问题分析
- omega定义错误:
omega = np.pi*m中,m是音频长度(标量/整数),因此omega是单个float值而非数组。代码中尝试用omega[i]访问下标,直接触发"float不可下标访问"的错误。频率响应需要的是从0到π的连续频率轴数组。 - 绘图变量错误:代码中使用
ax5.set_xlabel和ax5.set_ylabel,但实际创建的轴对象是ax,后续会引发未定义错误。 - 潜在索引风险:需确保
t_lag不超过inv_a和a的长度,避免出现索引越界问题。
修复方案
1. 修正omega的生成
将omega改为生成从0到π的m个均匀采样点,符合频率响应的计算需求:
omega = np.linspace(0, np.pi, m)
2. 修复绘图变量名
把未定义的ax5替换为实际创建的轴对象ax,同时修正x轴标签为更准确的含义:
ax.set_xlabel('Frequency (rad/sample)', fontsize='x-small') ax.set_ylabel('Magnitude', fontsize='x-small')
3. 可选:向量化优化(替代循环)
原双层循环效率较低,可改用numpy向量化操作提升性能,示例如下:
# 生成lag索引数组 j_arr = np.arange(1, t_lag) # 计算x_real和x_imaj的向量化操作 cos_terms = np.cos(j_arr[:, None] * omega[:int(m/2)]) sin_terms = np.sin(j_arr[:, None] * omega[:int(m/2)]) x_real[:int(m/2)] = 1 - np.sum(inv_a[j_arr, None] * cos_terms, axis=0) x_imaj[:int(m/2)] = np.sum(inv_a[j_arr, None] * sin_terms, axis=0) # 同理处理h_real和h_imaj cos_terms_h = np.cos(j_arr[:, None] * omega[:int(m/2)]) sin_terms_h = np.sin(j_arr[:, None] * omega[:int(m/2)]) h_real[:int(m/2)] = 1 - np.sum(a[j_arr, None] * cos_terms_h, axis=0) h_imaj[:int(m/2)] = np.sum(a[j_arr, None] * sin_terms_h, axis=0)
完整修复代码
import numpy as np import matplotlib.pyplot as plt # 假设m、t_lag、inv_a、a已提前定义 omega = np.linspace(0, np.pi, m) x_real = np.zeros(m) x_imaj = np.zeros(m) for i in range(0, int(m/2)): for j in range(1, t_lag): x_real[i] += inv_a[j]*np.cos(j*omega[i]) x_imaj[i] += inv_a[j]*np.sin(j*omega[i]) x_real[i] = 1-x_real[i] H_2 = 1/np.sqrt(x_real**2+x_imaj**2) #Frequency Response for Linear Prediction h_real = np.zeros(m) h_imaj = np.zeros(m) for i in range(0, int(m/2)): for j in range(1, t_lag): h_real[i] += a[j]*np.cos(j*omega[i]) h_imaj[i] += a[j]*np.sin(j*omega[i]) h_real[i] = 1-h_real[i] H_1 = 1/np.sqrt(h_real**2+h_imaj**2) #Plotting Frequency Response fig, ax = plt.subplots(figsize=(40,20)) ax.plot(H_1, color='red', label='A Omega') ax.plot(H_2, color='blue', label='H Omega') ax.set_title("Frequency Response", font="times new roman", size=55) ax.set_xlabel('Frequency (rad/sample)', fontsize='x-small') ax.set_ylabel('Magnitude', fontsize='x-small') fig.tight_layout() ax.legend(fontsize=50) plt.show()
内容的提问来源于stack exchange,提问作者Armand Surbakti
相关产品推荐
相关产品推荐

