音频筑基:基音、基频和共振峰

音频筑基:基音、基频和共振峰

音频信号分析中,经常遇到基音、周期、共振峰的概念,这里总结下自己的粗浅理解,不当之处,还望各位大佬提出指正。

是什么


基音,是复音中强度最大、频率最低的音。表征着声音的音高,即人们所感知到的音调高低。通常是以频率维度衡量,所以也叫基音频率,简称基频F0。有时粗略讲,又叫音高,英文名Pitch。

  • 基音周期Period:气流经声门的周期间隔,体现声源激励信息,设时间为T(s),物理含义为是时域波形最小重复的时间。
    • 周期Period是指声音波形中一个完整的周期所需要的时间。
    • 周期Period一般可以通过分析波形的重复模式来确定,比如:计算波形中相邻两个峰值(或谷值)之间的时间间隔来获得。
  • 基音频率Fundamental Frequency,是基音周期的倒数F0=1/T

共振峰,英文名Formant,表现为频谱上由基频衍生的次谐波(能量最强的一根根横线)。

  • 共振峰产生原理:F1、F2,经声门后来到声道处与发声环境产生共振的频率,体现声道环境信息。

深入理解


周期Period和基音Pitch如何转换?

Pitch指的是音频信号的基波周期,用周期或者频率来表示,如周期为4.3ms,对应频率就是230Hz,跟频谱图的频率概念是有别的。语音信号场景,基音指标十分重要。

转换公式为:Pitch = 1 / Period。换句话说,基音Pitch的值是周期Period的倒数。这意味着,周期越短,基音Pitch就越高;周期越长,基音Pitch就越低。

严格意义上讲,音高Pitch和基频F0有何区别?

严格说,音高的概念更广,音高主要由基频决定。通常认为,音高增高八度音程相当于基频翻倍。

  • 基频F0是指声音波形中最低频率的周期性振动频率,也就是声音的基频。在语音信号中,基频F0通常对应于说话人的声调(tone),也就是说话人说话时的基本音高。基频F0的单位是赫兹(Hz)。
  • 基音Pitch是指声音的音高,通常用赫兹(Hz)或半音(semitone)来表示。在音乐领域中,Pitch通常指的是乐器演奏的音高,而在语音领域中,Pitch通常指的是说话人的音高。

男声和女声的基频范围是?

  • 男声基频:60-150Hz
  • 女声基频:200-400Hz

相关参考


  1. 声音基频f0_音高和基频(Pitch and F0),link
  2. 音频(二) 基音周期与共振峰, link
  3. 基音周期和共振峰,link
  4. Wikipedia:共振峰,link
  5. 口语元音中的共振峰和谐波,link
  • 8
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
倒谱法是一种常用的基音周期检测方法,可以借助MATLAB实现。下面提供一个简单的基音周期检测和共振检测的MATLAB代码示例,供参考。 ```matlab % 基音周期检测和共振检测 % 首先读取音频文件,使用matlab自带的audioread函数 [x, fs] = audioread('voice.wav'); % 设置分析参数 winlen = 512; % 窗口长度 overlap = 256; % 帧重叠长度 nfft = 1024; % FFT点数 preemph = 0.97; % 预加重系数 minf0 = 80; % 最小基频 maxf0 = 300; % 最大基频 voicedthresh = 0.4; % 有声门限 unvoicedthresh = 0.1; % 无声门限 % 对每一帧进行处理 frames = enframe(x, winlen, overlap); % 分帧 nframes = size(frames, 1); % 帧数 f0 = zeros(nframes, 1); % 存储基频 formants = zeros(nframes, 4); % 存储共振 for i = 1:nframes frame = frames(i, :); % 取出一帧 frame = filter([1 -preemph], 1, frame); % 预加重 spec = abs(fft(frame, nfft)); % 傅里叶变换 spec = spec(1:nfft/2); % 取一半 logspec = log(spec); % 取对数 cepstrum = ifft(logspec); % 倒谱 cepstrum = cepstrum(1:nfft/2); % 取一半 cepstrum(1:minf0/fs*nfft) = 0; % 去掉基频以下的分量 cepstrum(maxf0/fs*nfft:end) = 0; % 去掉基频以上的分量 [~, locs] = findpeaks(cepstrum); % 找值 if ~isempty(locs) f0(i) = fs/locs(1); % 基频为第一个的频率倒数 formants(i, :) = locs(2:5)*fs/nfft; % 共振为2~5个的频率 end end % 判断有声无声 voiced = f0 > voicedthresh*fs/winlen & f0 < maxf0; unvoiced = f0 < unvoicedthresh*fs/winlen; f0(unvoiced) = 0; % 无声部分基频设为0 % 绘制频谱、倒谱、基频共振等 t = (0:nframes-1)*overlap/fs; f = (0:nfft/2-1)/nfft*fs; figure; subplot(2, 2, 1); imagesc(t, f, 20*log10(abs(spec))); axis xy; xlabel('Time (s)'); ylabel('Frequency (Hz)'); title('Spectrogram'); subplot(2, 2, 2); imagesc(t, f, 20*log10(abs(cepstrum))); axis xy; xlabel('Time (s)'); ylabel('Quefrency'); title('Cepstrum'); subplot(2, 2, 3); plot(t, f0, 'r'); axis([0 max(t) 0 maxf0]); xlabel('Time (s)'); ylabel('Frequency (Hz)'); title('Pitch'); subplot(2, 2, 4); plot(t, formants); axis([0 max(t) 0 maxf0]); xlabel('Time (s)'); ylabel('Frequency (Hz)'); title('Formants'); legend('F1', 'F2', 'F3', 'F4'); ``` 该代码读取声音文件`voice.wav`,对每一帧进行基音周期检测和共振检测,并将结果绘制成图形。其中,`enframe`是分帧函数,`findpeaks`是寻找值函数。可以根据需要自行调整参数,例如窗口长度、帧重叠长度、FFT点数等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值