基于Matlab App Designer的语音信号分析与处理(一):语音信号的采集,时域、频域分析

目录

一、课题的任务

二、内容、步骤和要求

(1)语音信号的采集

实现方法:

语音信号的采集完整代码:

(2)语音信号的分析

1)语音信号的时域分析

2)语音信号的频域分析

语音信号的时域、频域分析完整代码:

 3)语音信号的播放


一、课题的任务

利用 Matlab 设计一个图形用户界面,能够实现对语音信号进行时域和频域上的一些相关处理和分析,并能够通过图形界面功能,将处理后的语音进行播放或者输出显示相关图形。

二、内容、步骤和要求

(1)语音信号的采集

使用电脑的声卡设备采集一段语音信号,并存储在电脑中。

实现方法:

①利用 audiorecorder 和 recordblocking 函数可以实现电脑录音。

voice = audiorecorder(Fs, nBits, nChannels);

没有输入参数时,默认创建采样率为 8000 Hz ,8 bit,单通道的对象。

Fs 指定采样率,单位为 Hz ,由 nBits 指定采样点的比特数,nChannels 为指定通道数。

recordblocking(recorderObj, length)

recorderObj 为保存音频信息的对象,length 为录音时长,单位为 s.

②利用 getaudiodata 函数从音频记录对象中获取记录到的音频数据。

y = getaudiodata(recorder);

在 double 数组 y 中返回与 audiorecorder 对象 recorder 相关联的录制音频数据。

③利用  audiowrite 函数存储录音。

audiowrite(filename, y, Fs)

以采样率 Fs 将音频数据矩阵 y 写入名为 filename 的文件。

语音信号的采集完整代码:

fs = 48000;  % 采样频率
length = 4; % 时间长度(秒) 
% 创建一个录音文件:fs =48000Hz, 16-bit, 单通道
recorderObj = audiorecorder(fs, 16, 2);   
recordblocking(recorderObj, length); % 录音4秒钟
stop(recorderObj);
y = getaudiodata(recorderObj);
ymax = max(abs(y)); % 归一化
y = y/ymax;
audiowrite('C:\Users\swh\Desktop\3.wav', y, fs); % 存储录音文件

(2)语音信号的分析

语音信号的处理分析的目的就在于有效提取并表示语音信号所携带的信息。语音信号分析可分为时域分析和频域分析等处理方法。时域分析主要是对信号的时域波形进行分析。

1)语音信号的时域分析

提取:通过图形用户界面上的菜单功能键采集电脑设备上的一段音频信号, 完成音频信号的频率、幅度等信息的提取,并获得该语音信号的波形图。

实现方法:

①利用 audioread 函数可以获取电脑中存储的音频信号。

[y, Fs] = audioread(filename);

filename文件的位置加名字,音频格式为wav等,文件名需带引号。文件是在MATLAB菜单栏下的当前文件路径下,可以只写文件名。文件不在路径里面调用,需要完整地址。

Fs采样频率,1秒内对连续的音频信号取的点的个数

y输出的音频数字信号,默认是n行2列,该音频信号为两个声道,n的值等于该音频信号的时长乘采样频率Fs。

② 时域分析

图象的绘制plot.

plot(t, x);%绘制时域波形

t:时间;x:音量。

调整:通过图形用户界面上的菜单功能键对输入的音频信号进行各种变换, 如幅度变换、频率变换等操作,以实现对语音信号的调整。

实现方法:

[y, Fs] = audioread(filename);

幅度变换:对上述 y 值进行线性变换。

频率变换:①对上述 Fs 值进行线性变换;

                  ②利用 shiftPitch 函数;

audioOut = shiftPitch(audioIn,nsemitones);

将音频输入的音高移动指定数量。

2)语音信号的频域分析

变换:在图形用户界面下对采集的语音信号进行傅里叶等变换,并给出变换前后的频谱图。

实现方法:

①利用 fft 函数实现傅里叶变换。

Y = fft(X);

用快速傅里叶变换 (FFT) 算法计算 X 的离散傅里叶变换 (DFT)。

②频域分析

图象的绘制plot.

语音信号的时域、频域分析完整代码:

[x,Fs] = audioread("C:\Users\swh\Desktop\1.wav");
N = length(x); % 求取抽样点数
t = (0:N-1)/Fs; % 显示实际时间
y = fft(x); % 对信号进行傅里叶变换
f = Fs/N*(0:round(N/2) - 1); % 显示实际频点的一半,频域映射,转化为Hz
plot(t, x); % 绘制时域波形
plot(f, abs(y(1:round(N/2)))); % 绘制频域波形

 3)语音信号的播放

利用 sound 函数播放语音信号。

sound(x, Fs)

x 是 [x,Fs] = audioread("C:\Users\swh\Desktop\1.wav");中的x.

Fs 是 [x,Fs] = audioread("C:\Users\swh\Desktop\1.wav");中的x.

x,Fs 也可以根据上文所述线性变换所得到的,实现语音信号的大小变化和音调变化。

猜你喜欢

转载自blog.csdn.net/weixin_53877178/article/details/122470759