在MATLAB中输出倒谱的步骤如下:
读取语音信号
```matlab
[x, fs] = audioread('speech.wav'); % 读取语音信号
```
预加重
```matlab
preEmph = [1 - 0.97]; % 预加重滤波器
x_preEmph = preEmph .* x; % 应用预加重
```
分帧
将预加重后的信号划分为一系列短时间帧,通常几毫秒到几十毫秒。
加窗
对每个时间帧应用窗函数(如汉明窗、Hann窗等)加权。
```matlab
window =hann(length(x_preEmph)); % 使用汉明窗
x_window = window .* x_preEmph; % 加窗
```
傅立叶变换
对每个时间帧应用快速傅立叶变换(FFT),将时域信号转换成复数频率谱。
```matlab
X = fft(x_window); % FFT变换
```
取对数
计算频率谱的对数,因为人类耳朵对频率的感知是对数分布的。
```matlab
logX = log(abs(X)); % 取对数幅度谱
```
离散余弦变换(DCT)
对取对数后的频谱进行离散余弦变换,特别是取前几个系数(通常是奇次项,称为梅尔频率倒谱系数,MFCCs)。
```matlab
c = dct(logX); % DCT变换
```
去除直流分量
由于DCT会生成一个包含0Hz(直流)和各正频率的序列,通常保留非零部分(除第一个值外)作为倒谱结果。
```matlab
c = c(2:end); % 去除直流分量
```
归一化
为了方便后续处理,有时会对MFCCs进行标准化或归一化,使其具有相似的尺度。
```matlab
c = c / max(c); % 归一化
```
绘制倒谱图
使用MATLAB的绘图功能绘制倒谱图。
```matlab
figure;
subplot(2,1,1);
plot(c);
title('浊音段的倒谱');
ylabel('c(n)');
```
完整的代码示例:
```matlab
% 读取语音信号
[x, fs] = audioread('speech.wav');
% 预加重
preEmph = [1 - 0.97];
x_preEmph = preEmph .* x;
% 分帧
frameSize = 256; % 帧大小
hopSize = 128; % 帧移位
numFrames = length(x_preEmph) - frameSize + 1;
frames = [];
for i = 1:numFrames
frames(end+1) = x_preEmph(i:i+frameSize-1);
end
% 加窗
window =hann(frameSize);
c = zeros(frameSize, numFrames);
for i = 1:numFrames
c(:, i) = window .* frames(i);
end
% 傅立叶变换
X = fft(c);
% 取对数
logX = log(abs(X));
% 离散余弦变换(DCT)
c = dct(logX);
% 去除直流分量
c = c(2:end);
% 归一化
c = c / max(c);
% 绘制倒谱图
figure;
subplot(2,1,1);
plot(c);
title('浊音段的倒谱');
ylabel('c(n)');
xlabel('帧索引');
```
这个代码示例展示了如何在MATLAB中计算并绘制语音信号的倒谱。你可以根据需要调整参数,例如帧大小、帧移位等,以适应不同的语音信号和分析需求。