Python绘制频谱图遇TypeError: 'float' object is not callable错误求助
问题:Matplotlib绘制频谱图时出现TypeError错误
原代码
import numpy as np import matplotlib.pyplot as plt sampling_frequency_48kHz = 48000 t_48kHz = np.linspace(0, 10, sampling_frequency_48kHz * 10) signal_48kHz = np.sin(2 * np.pi * 5 * t_48kHz) sampling_frequency_8kHz = 8000 t_8kHz = np.linspace(0, 10, sampling_frequency_8kHz * 10) signal_8kHz = np.sin(2 * np.pi * 5 * t_8kHz) window_size = 0.03 overlap = 0 nfft = 2048 plt.figure() plt.specgram(signal_48kHz, Fs=sampling_frequency_48kHz, window=window_size, noverlap=overlap, NFFT=nfft) plt.title('Spektrogram pro 48 kHz') nfft = 512 plt.figure() plt.specgram(signal_8kHz, Fs=sampling_frequency_8kHz, window=window_size, noverlap=overlap, NFFT=nfft) plt.title('Spektrogram pro 8 kHz') plt.show()
错误信息
Traceback (most recent call last): File "c:\Users\OneDrive\Dokumenty\4_7.py", line 18, in <module> plt.specgram(signal_48kHz, Fs=sampling_frequency_48kHz, window=window_size, noverlap=overlap, NFFT=nfft) File "C:\Users\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.9_qbz5n2kfra8p0\LocalCache\local-packages\Python39\site-packages\matplotlib\pyplot.py", line 2818, in specgram __ret = gca().specgram( File "C:\Users\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.9_qbz5n2kfra8p0\LocalCache\local-packages\Python39\site-packages\matplotlib\__init__.py", line 1423, in inner return func(ax, *map(sanitize_sequence, args), **kwargs) File "C:\Users\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.9_qbz5n2kfra8p0\LocalCache\local-packages\Python39\site-packages\matplotlib\axes\_axes.py", line 7709, in specgram spec, freqs, t = mlab.specgram(x=x, NFFT=NFFT, Fs=Fs, File "C:\Users\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.9_qbz5n2kfra8p0\LocalCache\local-packages\Python39\site-packages\matplotlib\mlab.py", line 780, in specgram spec, freqs, t = _spectral_helper(x=x, y=None, NFFT=NFFT, Fs=Fs, File "C:\Users\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.9_qbz5n2kfra8p0\LocalCache\local-packages\Python39\site-packages\matplotlib\mlab.py", line 377, in _spectral_helper window = window(np.ones(NFFT, x.dtype)) TypeError: 'float' object is not callable
错误原因
错误核心是specgram函数的window参数使用错误:
- 你传入的
window_size是浮点型数值(0.03,代表时间长度),但该参数要求的是可调用的窗口函数(比如np.hanning)、窗口数组,或者字符串形式的窗口名称(比如'hann')。 - 若要设置窗口的时间长度,需要将其转换为对应采样率下的样本数,再通过
nperseg参数传入,该参数用于指定每个分析段的样本数量。
修正后的代码
import numpy as np import matplotlib.pyplot as plt sampling_frequency_48kHz = 48000 t_48kHz = np.linspace(0, 10, sampling_frequency_48kHz * 10) signal_48kHz = np.sin(2 * np.pi * 5 * t_48kHz) sampling_frequency_8kHz = 8000 t_8kHz = np.linspace(0, 10, sampling_frequency_8kHz * 10) signal_8kHz = np.sin(2 * np.pi * 5 * t_8kHz) window_size = 0.03 overlap = 0 nfft = 2048 # 计算对应采样率下的窗口样本数 window_samples_48kHz = int(window_size * sampling_frequency_48kHz) plt.figure() # 使用nperseg指定窗口样本数,window参数指定窗口类型(可选,默认汉宁窗) plt.specgram(signal_48kHz, Fs=sampling_frequency_48kHz, nperseg=window_samples_48kHz, noverlap=overlap, NFFT=nfft, window='hann') plt.title('Spektrogram pro 48 kHz') nfft = 512 window_samples_8kHz = int(window_size * sampling_frequency_8kHz) plt.figure() plt.specgram(signal_8kHz, Fs=sampling_frequency_8kHz, nperseg=window_samples_8kHz, noverlap=overlap, NFFT=nfft, window='hann') plt.title('Spektrogram pro 8 kHz') plt.show()
说明
nperseg参数控制每个分析窗口的样本数量,通过时间长度 × 采样率计算得到,符合你设置window_size=0.03秒的需求。window参数可指定窗口类型,比如'hann'(汉宁窗)、'hamming'(汉明窗)等,默认也是汉宁窗,可根据需求调整。
内容的提问来源于stack exchange,提问作者Marcin Sochacki
相关产品推荐
相关产品推荐

