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

关于scipy.io.wavefile.read()返回值及音频数组的技术问询

问题2:单声道WAV的一维整数数组是什么?怎么获取频率?

先直接给结论:这些整数不是频率,它们是音频样本的振幅值,用来记录某一时刻声波的振动强度。

为什么是这些整数?

音频原本是连续的模拟声波,要让电脑能处理,得做两步转换:

  1. 采样:每隔固定时间(时间间隔 = 1/采样率)取一次声波的振幅,这些取值点就是“样本”。
  2. 量化:把连续的振幅值转换成有限范围的整数(比如16位WAV把振幅映射到-32768到32767之间),你看到的一维数组就是按时间顺序排列的量化结果——相当于把连续的声波拆成了一个个时间点上的幅度快照。

怎么通过样本获取频率?

要得到音频的频率成分,得用傅里叶变换(FFT),它能把时域的振幅数据转换成频域的频率分布。这里给你一个入门级的实现示例:

import numpy as np
from scipy.io import wavefile

# 读取目标WAV文件
sample_rate, audio_data = wavefile.read("your_audio_file.wav")

# 先把整数类型转成浮点,避免FFT计算时溢出
audio_float = audio_data.astype(np.float32)
# 执行FFT变换
fft_result = np.fft.fft(audio_float)

# 生成对应的频率轴(每个FFT结果对应的频率值)
freq_axis = np.fft.fftfreq(len(audio_float), 1 / sample_rate)

# 取FFT结果的幅度(复数的模,代表该频率的强度)
fft_amplitude = np.abs(fft_result)

# 找到幅度最大的频率(即音频的主要频率成分)
max_amp_idx = np.argmax(fft_amplitude)
dominant_freq = freq_axis[max_amp_idx]

print(f"音频的主要频率成分:{dominant_freq:.2f} Hz")

小提示:FFT结果是对称的,实际分析时只需要关注正频率部分(freq_axis >= 0);如果是复杂声音(比如音乐、人声),你会看到多个频率峰值,每个峰值对应一个声音成分的频率。


内容的提问来源于stack exchange,提问作者Primusa

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 04:10:43