关于scipy.io.wavefile.read()返回值及音频数组的技术问询
问题2:单声道WAV的一维整数数组是什么?怎么获取频率?
先直接给结论:这些整数不是频率,它们是音频样本的振幅值,用来记录某一时刻声波的振动强度。
为什么是这些整数?
音频原本是连续的模拟声波,要让电脑能处理,得做两步转换:
- 采样:每隔固定时间(时间间隔 = 1/采样率)取一次声波的振幅,这些取值点就是“样本”。
- 量化:把连续的振幅值转换成有限范围的整数(比如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
相关产品推荐
相关产品推荐

