自己编写matble函数实现线性预测谱的绘制
时间: 2023-05-26 16:02:59 浏览: 114
以下是一个示例代码,其中使用了matlab自带的fft函数进行频谱分析,并将结果用plot函数绘制出来。
```matlab
function lpc_spectrogram(signal, Fs, order, windowSize, overlap)
% signal: 输入信号
% Fs: 采样频率
% order: LPC预测的阶数
% windowsSize: 窗口大小
% overlap: 帧之间的重叠比例
% 设置分析参数
N = length(signal); % 信号长度
w = hamming(windowSize); % 窗函数
step = windowSize - overlap * windowSize; % 帧移
numFrames = floor((N - windowSize) / step) + 1; % 分帧数
% 初始化输出数据
spec = zeros(windowSize, numFrames); % 频谱图矩阵
% 分帧处理
for i = 1:numFrames
startIdx = (i - 1) * step + 1; % 起始位置
endIdx = startIdx + windowSize - 1; % 结束位置
x = signal(startIdx:endIdx) .* w; % 加窗
a = lpc(x, order); % LPC分析
[H, f] = freqz(1, a, windowSize, Fs); % 频谱分析
spec(:, i) = abs(H); % 取模值
end
% 绘制频谱图
freq = linspace(0, Fs / 2, windowSize / 2 + 1); % 频率轴
time = linspace(0, N / Fs, numFrames); % 时间轴
imagesc(time, freq, 20 * log10(spec(1:windowSize / 2 + 1, :))); % 绘制频谱图
axis xy; colormap(jet); colorbar; % 设置坐标轴、色标
xlabel('Time [s]'); ylabel('Frequency [Hz]');
title('Linear Predictive Coding Spectrogram');
end
```
使用示例:
```matlab
load('example_signal.mat'); % 载入样例信号
Fs = 16000; % 采样频率
order = 16; % 预测阶数
windowSize = 512; % 窗口大小
overlap = 0.75; % 帧重叠比例
lpc_spectrogram(signal, Fs, order, windowSize, overlap); % 绘制频谱图
```
阅读全文