• 语音信号处理基础知识之频谱、相位谱、幅度谱、功率谱及语谱图


    1,语音信号处理

    一段音频信号在时域上,可以用一个实数向量来表示。这个数组的大小=采样率*音频时长。举个例子:一段采样率为8000,长15.6s的音频在matlab中表示为:15.6x8000=124800大小的实数向量

    在这里插入图片描述

    下面是利用matlab读取.wav文件和.pcm文件的两种方法

    1.1 读取wav

    [x1, fs_n] = audioread('test\Far_common.wav');   
    
    • 1

    1.2 读取pcm

    fid_far = fopen("test\Far_common.pcm",'r'); 
    x_far = fread(fid_far,inf,'int16');
    
    • 1
    • 2

    在这里插入图片描述

    从上图可以看出,音频信号在matlab中就是用一个向量来表示。

    2,语音信号处理基础知识

    2.1, 频谱

    概念: 表示信号频率与能量的关系。频谱图一般由相位频谱图和幅度频谱图两部分构成。

    绘制方法: 对一段时域音频做傅里叶变换,得到的就是频谱图。但是由于其包含两部的信息,因此不能直接绘制。其可以作为相位频谱图和幅度频谱图分别进行绘制。

    [x1, fs_n] = audioread('D:\blog\新建文件夹\Far_common.wav');   
    xi_fd = fft(x1);
    
    • 1
    • 2

    观察结果可以发现,一维向量做傅里叶变化后得到一个同样的大小的复数向量。

    在这里插入图片描述

    2.1.1 相位频谱图

    概念: 在傅里叶分析中,将各个分量的相位随频率的变化成为信号的相位谱。

    绘制方法: 将频谱中的幅值部分换成相角,这里利用matlab中的angle函数进行绘制。

    [x1, fs_n] = audioread('test\Far_common.wav');   
    
    %频域信息
    x1_fd = fft(x1);
    
    %求相位谱
    n=0:length(x1)-1;
    f=n*fs_n/length(x1);
    x1_abs = abs(x1_fd);
    ph= 2*angle(x1_fd(1:length(x1)/2));
    ph= ph *180/pi;
    plot(f(1:length(x1)/2),ph(1:length(x1)/2));
    xlabel('频率/hz'),ylabel('相角'),title('相位谱');
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    在这里插入图片描述

    这里由于选取音频的问题,导致相位谱太过密集。

    2.1.2 幅度频谱图

    概念: 在傅里叶分析中,将各个分量的幅度随频率的变化成为信号的幅度谱。

    绘制方法: 对信号进行fft后的复数向量进行取模操作,得到的就是幅度谱。

    %求幅度谱
    x1_fd_abs = abs(x1_fd);
    plot(f(1:length(x1)/2),x1_fd_abs(1:length(x1)/2));
    xlabel('频率/hz'),ylabel('幅度'),title('幅度谱');
    
    • 1
    • 2
    • 3
    • 4

    在这里插入图片描述

    2.2,功率谱(能量谱):

    概念: 功率谱是功率谱密度函数的简称,它定义为单位频带内的信号功率。它表示了信号功率随着频率的变化情况,即信号功率在频域的分布状况。

    绘制方法: 对信号进行fft后的复数向量进行求实部和虚部的平方和操作,得到的就是功率谱。(即幅度谱的平方)

    %求功率谱
    for i=1:length(x1_fd)
        x1_power(i)=power(real(x1_fd(i)),2)+power(imag(x1_fd(i)),2);
    end
    
    • 1
    • 2
    • 3
    • 4

    在这里插入图片描述

    2.3,语谱图:

    概念: 语谱图的横坐标是时间,纵坐标是频率,坐标点值为语音数据能量。由于是采用二维平面表达三维信息,所以能量值的大小是通过颜色来表示的,颜色深,表示该点的语音能量越强。其可以理解为利用二维坐标表示三维信息。

    绘制方法: 这里利用了matlab中Voicebox资源包下的enframe函数。

    %求语谱图
    clear all; clc; close all;
    [x,Fs]=audioread('test\Far_common.wav');   %读入数据文件
    wlen=800; inc=80; win=hanning(wlen);% 设置帧长,帧移和窗函数
    N=length(x); time=(0:N-1)/Fs;       % 计算时间
    y=enframe(x,win,inc)';              % 分帧
    fn=size(y,2);                       % 帧数
    frameTime=(((1:fn)-1)*inc+wlen/2)/Fs; % 计算每帧对应的时间
    W2=wlen/2+1; n2=1:W2;
    freq=(n2-1)*Fs/wlen;                % 计算FFT后的频率刻度
    Y=fft(y);                           % 短时傅里叶变换
    clf                                 % 初始化图形
    % 画出语谱图        
    set(gcf,'Position',[20 100 600 500]);            
    axes('Position',[0.1 0.1 0.85 0.5]);  
    imagesc(frameTime,freq,abs(Y(n2,:))); % 画出Y的图像  
    axis xy; ylabel('频率/Hz');xlabel('时间/s');
    title('语谱图');
    % 画出语音信号的波形  
    axes('Position',[0.07 0.72 0.9 0.22]);
    plot(time,x,'k');
    xlim([0 max(time)]);
    xlabel('时间/s'); ylabel('幅值');
    title('语音信号波形');
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    在这里插入图片描述

    以上就是我对音频信号处理分析过程中遇到的幅度谱、相位谱、能量谱等基础知识的总结,如有错误,欢迎指正。

  • 相关阅读:
    speedoffice(PPT)怎么设置文字竖向
    AM驱动架构—优质Mini-LED显示技术解决方案
    【新知实验室 认识TRTC+四步跑通音视频demo】
    spring配置双数据源
    Spring—AOP
    TensorFlow入门(十、共享变量)
    redis的高可用
    IPV6的内容
    Python学习记录 包
    由于找不到vcruntime140_1.dll,无法继续执行代码重新安装程序可能会解决此问题
  • 原文地址:https://blog.csdn.net/qq_44085437/article/details/125376660