语音信号加窗处理与短时傅里叶变换

该代码示例演示了如何对语音信号进行加窗处理,并使用短时傅里叶变换(STFT)分析其频谱特性。

1. 加载语音信号

[x,fs] = audioread('C:\Users\ASUS\Desktop\20230607_210020.wav');
x=x(:,1);

读取 .wav 格式的语音文件,存储在变量 x 中,并获得采样率 fs。

2. 设置窗口大小及重叠长度

winlen = 0.1; % 窗口大小
winshift = 0.01; % 重叠长度

设置窗口大小 winlen 为 0.1 秒,重叠长度 winshift 为 0.01 秒。

3. 计算窗口长度和重叠长度的样点数

nwinlen = round(winlen*fs); % 窗口长度(样点数)
nwinshift = round(winshift*fs); % 重叠长度(样点数)

由于短时傅里叶变换需要指定窗口长度和重叠长度的样点数,因此需要将窗口长度 winlen 和重叠长度 winshift 乘以采样率 fs 并四舍五入得到样点数 nwinlen 和 nwinshift。

4. 加窗

nx = length(x);
win_rect = rectwin(length(x)); % 窗矩阵
w_rect = x.*win_rect;% 矩形窗

win_ham= hamming(length(x)); % 窗矩阵
w_ham= x.*win_ham; % 汉明窗

使用矩形窗和汉明窗对原始语音信号 x 进行加窗处理,得到窗函数分别为 win_rect 和 win_ham,加窗后的语音信号分别为 w_rect 和 w_ham。

5. 时域波形

t = (0:nx-1)/fs; % 时间轴
subplot(2,2,1);
plot(t,x,'k');title('原始波形');
subplot(2,2,2);
plot(t,w_rect);
title('加矩形窗后波形');
subplot(2,2,3);
plot(t,w_ham);
title('加汉明窗后波形');

将原始波形 x、加矩形窗后的波形 w_rect 和加汉明窗后的波形 w_ham 绘制在时域上,展示不同窗函数对波形的影响。

6. 短时频谱

figure()
hop=1;
nfft = 512; % FFT点数
f=1:0.5:60;%设置频率刻度
win_overlap = 1;
subplot(2,2,4);
win_rect= rectwin(nfft);
[S_rect,f,t_rect] = spectrogram(x,win_rect,win_overlap,nfft,fs);
S_rect = abs(S_rect);
imagesc(t_rect,f,abs(S_rect));axis xy;
title('加矩形窗后短时频谱');
subplot(2,2,3);
win_ham= hamming(nfft);
[S_ham,f,t_ham] = spectrogram(x,win_ham,win_overlap,nfft,fs);
S_ham=abs(S_ham);
imagesc(t_ham,f,abs(S_ham));
title('加汉明窗后短时频谱');

使用短时傅里叶变换对原始语音信号 x、加矩形窗后的语音信号 w_rect 和加汉明窗后的语音信号 w_ham 进行分析,得到它们的短时频谱 S_rect 和 S_ham,并将其绘制出来,展示不同窗函数对短时频谱的影响。其中,nfft 为 FFT 点数,f 为频率刻度,win_overlap 为重叠长度的样点数,hop 为帧移(即每次分析的语音帧之间的间隔)。

语音信号加窗处理与短时傅里叶变换

原文地址: https://www.cveoy.top/t/topic/oy9m 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录