倒谱法的基因周期检测matlab,Matlab在基音周期检测教学中的应用研究

本文探讨了基音周期检测的难点,如非周期性、声道影响和端点检测,并介绍了使用Matlab进行倒谱法仿真分析以可视化语音信号基音周期的方法,有助于教学和理解。
摘要由CSDN通过智能技术生成

朱徐来

886ecb4cc6d21442a85479ca593462ea.png

b9d693c0ccac02a9a7964905f761ed6b.png

e592a03ca345a98fbde84344f8b047a1.png

摘要:基音周期是《语音信号处理》中的重点和难点,基音周期作为语音信号的重要参数,在语音编码、语音合成和语音识别等方面,有着非常重要的作用。本文采用Matlab对基因周期进行仿真分析,从仿真图上查看语音信号的基音周期,让学生更形象的理解语音信号的基音周期。

关键词:基音周期;语音编码;语音合成;语音识别;仿真

中图分类号:G642        文献标识码:A

文章编号:1009-3044(2020)02-0188-02

1 概述

语音信号是通信工程专业的一门必修课,其中基音周期是一个重要的知识点,对于基音周期的检测十分困难,处理复杂,且变化范围较大,不同的人群,他们的基音周期差别相当明显。即使同一个人在不同环境下的基音周期也会有所不同

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值