基于matlab,3.根据图1-2所示的MFCC系数计算流程,编写MFCC计算函数,并用来计算一段语音的MFCC系数。函数定义为: ccc=Nmfcc(x,fs,p,frameSize,inc) 其中:x是输入语音序列,Mel滤波器的个数为p,采样频率为fs,frameSize为帧长和FFT点数,inc为帧移;ccc为MFCC参数。画出该语音信号每通道的MFCC系数
时间: 2024-03-23 14:39:50 浏览: 68
好的,您的问题是如何根据图1-2所示的MFCC系数计算流程,编写MFCC计算函数,并用来计算一段语音的MFCC系数,以及画出该语音信号每通道的MFCC系数。
首先,我们需要了解MFCC的计算流程。MFCC是一种语音特征提取方法,其主要步骤包括预加重、分帧、加窗、傅里叶变换、Mel滤波器组、离散余弦变换以及能量归一化等。
根据图1-2所示的MFCC系数计算流程,我们可以编写一个MFCC计算函数。下面是一个可能的实现:
```matlab
function ccc = Nmfcc(x, fs, p, frameSize, inc)
% x: 输入语音序列
% fs: 采样频率
% p: Mel滤波器的个数
% frameSize: 帧长和FFT点数
% inc: 帧移
% ccc: MFCC参数
% 预加重
x = filter([1 -0.97], 1, x);
% 分帧
nFrames = fix((length(x) - frameSize) / inc) + 1;
frames = zeros(frameSize, nFrames);
for i = 1:nFrames
index = (i - 1) * inc + 1;
frames(:, i) = x(index : index + frameSize - 1);
end
% 加窗
window = hamming(frameSize);
frames = frames .* repmat(window, 1, nFrames);
% 傅里叶变换
NFFT = 2 ^ nextpow2(frameSize);
magFrames = abs(fft(frames, NFFT));
% Mel滤波器组
melFilters = melFilterBank(fs, NFFT, p);
melSpec = melFilters * magFrames(1:frameSize / 2 + 1, :);
% 离散余弦变换
DCTMatrix = dctmtx(p);
ccc = DCTMatrix * log(melSpec);
% 能量归一化
ccc(1, :) = [];
ccc = ccc - repmat(mean(ccc), p - 1, 1);
end
```
其中,`melFilterBank`函数可以用来生成Mel滤波器组。下面是该函数的实现:
```matlab
function filters = melFilterBank(fs, NFFT, p)
% fs: 采样频率
% NFFT: FFT点数
% p: Mel滤波器的个数
% filters: Mel滤波器组
% 计算Mel频率
lowFreq = 0;
highFreq = fs / 2;
melLow = hz2mel(lowFreq);
melHigh = hz2mel(highFreq);
melAxis = linspace(melLow, melHigh, p + 2);
% 将Mel频率转换为Hz频率
hzAxis = mel2hz(melAxis);
% 将Hz频率转换为FFT点数的下标
binAxis = fix((NFFT + 1) * hzAxis / fs);
% 生成Mel滤波器组
filters = zeros(p, NFFT / 2 + 1);
for i = 1:p
filters(i, binAxis(i) : binAxis(i + 1)) = ...
triang(binAxis(i + 1) - binAxis(i) + 1);
filters(i, binAxis(i + 1) : binAxis(i + 2)) = ...
triang(binAxis(i + 2) - binAxis(i + 1) + 1);
end
end
function mel = hz2mel(hz)
% 将Hz频率转换为Mel频率
mel = 2595 * log10(1 + hz / 700);
end
function hz = mel2hz(mel)
% 将Mel频率转换为Hz频率
hz = 700 * (10 .^ (mel / 2595) - 1);
end
```
现在,我们可以用这个函数来计算一段语音的MFCC系数。假设我们有一个名为`speech.wav`的语音文件,采样频率为16kHz,Mel滤波器的个数为20,帧长和FFT点数为256,帧移为128。我们可以按照以下方式调用`Nmfcc`函数:
```matlab
[x, fs] = audioread('speech.wav');
ccc = Nmfcc(x, fs, 20, 256, 128);
```
最后,我们可以画出该语音信号每通道的MFCC系数。下面是一个可能的实现:
```matlab
figure;
imagesc(ccc);
xlabel('Frame index');
ylabel('MFCC index');
colorbar;
```
这将生成一个类似于图1-2的图形,其中每行表示一个MFCC通道,每列表示一个帧。
阅读全文