You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 09:25:12