zoukankan      html  css  js  c++  java
  • matlab绘制语谱图

    1.读取音频文件

    [cleanAudio,fs] = audioread('SA1W.WAV');
    %cleanAudio 为音频文件按照采样频率fs存储在计算机的数字信号(一维数据),其值代表幅度值。

    2.设置窗口函数、帧长、帧移

    windowLength = 256;%帧长
    win = hamming(windowLength,'periodic');%窗口函数(汉明窗)
    overlap = 128; %帧移(一般为帧长的一半)
    ffTLength = windowLength; %做DFT的点数,一般和帧长一样

    3.计算时间

    t = (1/fs) * (0:numel(cleanAudio)-1);%波形图的时间(单位为秒)

    4.绘图

    subplot(2,1,1)
    plot(t,cleanAudio);%利用读取的音频信号绘制波形图
    title('波形图')
    grid on;
    subplot(2,1,2)
    spectrogram(cleanAudio,win,overlap,ffTLength,fs,'yaxis');%绘制语谱图 'yaxis'代表频率轴在Y轴
    title('语谱图')
    

      

    5.解释

    1. spectrogram的返回值

    [S,F,T,P]=spectrogram(cleanAudio,win,overlap,nfft,fs,'yaxis');

    • S:是音频经过加窗、分帧、傅里叶变化得到的一个矩阵。时间分辨率是矩阵的列,频率分辨率为矩阵的行。这里cleanAudio如果是实值并且nfft是偶数,则S有 (nfft/2 + 1) 行,cleanAudio如果是实值并且nfft是奇数,则S有 (nfft + 1)/2 行。这里的信号是实值,nfft为256,所以S的行是129。

    • F: S的行,也就是频率分辨率,这里的值为129.

    • T: S的列,也就是时间分辨率,其中的每个值为各段的中点。如果频率分辨率固定,音频的数字信号的长度越长,该向量也越大。

    • P:能量谱密度。也是一个矩阵。和S的大小是一样的。是S中的每个值的平方。

    2.波形图和语谱图的时间轴看起来为什么是一样的?

      其实两个图的时间轴是不太一样的,时间分辨率是不一样的。在波形图中,时间的轴的长度是和音频的数字信号向量的长度是一样的,t = (1/fs) * (0:numel(cleanAudio)-1), t的值会随采样频率fs的变化而变化。相较于波形图,语谱图中时间分辨率是有所降低的。例如,有一个信号的长度为101000,窗口长度为200,返回的频率F分辨率为101,则时间T的分辨率为1000。所以,看起来是差不多的,但是其实时间的分辨率降低了很多,而且窗口长度越大,时间分辨率会越低。

    3.语谱图的频率轴和采样率什么关系?

      根据奈奎斯特定理,采样的频率大于信号频率的2倍,采样之后的数字信号可以完整的保存期原始信号信息。所以这里的频率轴的最高值是根据输入的采样频率来决定的,本例中采样频率为16000Hz,所以频率轴的最高值为8000Hz。

  • 相关阅读:
    在线编辑器fckeditor的使用和配置
    Oracle CHAR,VARCHAR,VARCHAR2类型的区别与使用
    where having 的区别
    软件架构师之我见
    在线编辑器fckeditor的使用和配置
    where having 的区别
    必须掌握的八个【cmd 命令行】
    浅析PHP实现同步远程MysqlPHP编程教程详解
    MSSQL智能感应
    SQL统计表行数
  • 原文地址:https://www.cnblogs.com/peter_zhang/p/matlab_spectrogram.html
Copyright © 2011-2022 走看看