MATLAB求音频信号特征的自定义函数.md

分帧和分窗处理:

  • 对信号x加窗分帧处理

    1
    2
    3
    4
    5
    6
    7
    wlen=50;      % 帧长                      
    inc=18; % 帧移
    win=hanning(wlen); % 窗函数
    fn=floor(((N-wlen)/inc))+1; % 计算帧数
    time=(0:N-1)/Fs;
    frameTime=(((1:fn)-1)*inc+wlen/2)/Fs;
    X=enframe(x,win,inc)'; %分窗处理

时域特征:

  • 求信号signal的时域特征

    • 时域函数

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      function [ rms,peak,factor] = timechara(signal)
      % timechara:作用,求输入信号的自相关序列的相关参数函数
      % 输入:signal:一帧信号的序列
      % 输出:rms:每帧信号的有效值(对时间的均值)
      % peak:每帧信号的峰值
      % factor(1):峰值因子,反映波形的形状特征
      % factor(2):脉冲因子
      % factor(3):裕度因子
      % factor(4):波形因子
      % factor(5):K因子
      % kurtosis:峭度
      wlen = length(signal(:,1)); % 每帧信号的采样点个数
      s_ave = mean(signal); % 每帧信号的均值
      rms = sqrt(sum((signal-s_ave).^2)/wlen); % 每帧信号的自相关序列的有效值(对时间的均值)
      peak = (max(signal)-min(signal))/2; % 每帧信号的峰值
      factor(1) = peak/rms; % crestfactor:每帧信号的峰值因子,反映波形的形状特征;
      factor(2) = peak/(sum(abs(signal))/wlen); % impulsefactor:每帧信号的脉冲因子
      factor(3) = peak/((sum(sqrt(abs(signal)))/wlen).^2); % marginfactor:每帧信号的裕度因子
      factor(4) = rms/(sum(abs(signal))/wlen); % shapefactor:每帧信号的波形因子
      factor(5) = peak*rms; % Kfactor:每帧信号的K因子
      factor(6) = kurtosis(signal); % kurtosis:峭度
      end
    • 例子

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      x=0:0.1:2*pi;
      y=sin(x); %信号
      ma = max(y); %最大值
      mi = min(y); %最小值
      me = mean(y); %平均值
      pk = ma-mi; %峰-峰值
      av = mean(abs(y)) %绝对值的平均值(整流平均值)
      va = var(y); %方差
      st = std(y); %标准差
      ku = kurtosis(y); %峭度
      rm = rms(y); %均方根
      S = rm/av %波形因子
      C = pk/rm; %峰值因子
      Kr = sum(y.^4)/sqrt(sum(y.^2)) %峭度因子
      I = pk/av %脉冲因子
      xr = mean(sqrt(abs(y)))^2;
      L = pk/xr; %裕度因子
  • 求信号的短时平均能量的函数。

    1
    2
    3
    4
    5
    6
    7
    8
    function [ E ] = energy( frame )
    % energy:对于一帧信号,求出短时能量
    % 输入参数:frame:一帧信号
    % 输出参数:E:信号的短时能量
    u=frame;
    u2=u.*u;
    E=sum(u2); %幅度的平方和
    end
  • 短时平均过零率

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    function [ zcr ] = zcr( frame )
    % zcr:求一帧信号的短时平均过零数
    % 输入参数:
    zcr = 0;
    wlen = length(frame);
    frame = frame-mean(frame); % 消除直流分量,但是此处处理后与在整个信号出消除直流分量求得的zrc有差距
    for i=1: (wlen-1) % 在一帧内寻找过零点
    %if条件处可加门限
    if frame(i)* frame(i+1)< 0 % 判断是否为过零点
    zcr = zcr+1; % 是过零点,记录1次
    end
    end
    end
  • 求输入信号的自相关序列的相关参数函数

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    function [ rms,peak,crestfactor] = fcorr(signal)
    % fcorr:作用,求输入信号的自相关序列的相关参数函数
    % 输入:signal一个信号的序列
    % 输出:rms:每个信号的自相关序列的有效值(对时间的均值)
    % peak:自相关函数序列的峰值
    % crestfactor:自相关函数序列的峰值因子,反映波形的形状特征
    wlen = length(signal(:,1));
    ss = xcorr(signal);
    ss = ss(1:wlen,:); % 因为相关函数是对称的,取前一半
    ss_ave = mean(ss); % 自相关函数序列的均值
    % rms = sqrt(sum((signal-ss_ave).^2)/wlen); % 这是rms的错误求法,但是测试的训练效果较好
    rms = sqrt(sum((ss-ss_ave).^2)/wlen); % 每个信号的自相关序列的有效值(对时间的均值)
    peak = (max(ss)-min(ss))/2; % 峰值
    crestfactor = peak/rms; % 峰值因子,反映波形的形状特征;
    end

时频域特征

  • 求信号的小波的特性

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    function [ energy,sqr ] = wave( frame )
    % 输入参数:frame:一帧信号
    % 输出参数:
    %---------energy:小波系数的能量
    %---------sqr:小波系数的均方差
    T = wpdec(frame,2,'db2'); %db8小波做两层分解
    %重构第二层的所有节点
    for i = 1:4
    y = wprcoef(T,[2,i-1]);
    energy(:,i) = sum(y.*y); %重构信号的能量
    sqr(:,i) = var(y); %重构信号的均方差
    end
    end
  • 小波变换的改进函数

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    function [ energy,sqr] = wave( frame,N )
    % wave:求信号的小波的特性
    % 输入参数:frame:一帧信号
    % 输出参数:energy:小波系数的能量;sqr:小波系数的均方差;coef:波峰系数
    T = wpdec(frame,N,'db8'); %db8小波做N层分解
    %重构第N层的指定节点
    for i = 1:(2^N)
    y = wprcoef(T,[N,i-1]);
    % y = wprcoef(T,[N,mum(i)]);
    energy(:,i) = sum(y.*y); %重构信号的能量
    sqr(:,i) = var(y); %重构信号的均方差
    % coef(:,i) = max(y)/mean(y); %重构信号的波峰系数,效果不好
    end
    end
  • HHT变换的相关特征求取函数

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    % 对一个信号做HHT变换,求得相关的特征
    function [peaks,bjpvar,aveA,mseA,rmsA,msize,ratio1,msee] = infreqfeature(x,fs)
    % 输入:x 是一个信号,是一个列向量
    % 输出:
    % peaks 边际谱的前4个峰值
    % bjpvar 边际谱的方差
    % aveA 各分量瞬时幅度的均值
    % rmsA 各分量瞬时幅度的有效值
    % mseeA 各分量瞬时幅度的方差和
    % msize(1)、msize(2)、msize(3)、msize(4):瞬时频率第三个分量的极大值、极小值点数和第四个分量的极大值、极小值点的个数
    % ratio 各分量瞬时频率的方差贡献率
    %
    %
    % 调用的函数:
    % hht工具箱函数: emd()、hhspectrum()、toimage()
    % 自定义函数: findmainfreq()
    N = length(x);
    imp=emd(x); % 对信号进行EMD分解
    [m,n]=size(imp); % 求取EMD分解成几个分量
    % 对IMF分量求取瞬时频率与振幅:A:是每个IMF的振幅向量,f:每个IMF对应的归一化瞬时频率,t:时间序列号
    [A,f,t] = hhspectrum(imp);
    % 求瞬时频率
    infreq = fs * f;
    %求信号的边界谱bjp,E:对应的振幅值
    [E,tt1]=toimage(A,f,t,length(t));
    enery = E;
    E=flipud(E);
    for k=1:size(E,1)
    bjp(k)=sum(E(k,:))*1/fs;
    end
    % 求边界谱的峰值和对应的采样点的位置
    % peaks表示前5个峰值,如果需要求这些峰值对应的位置,直接在peaks参数后面加一个参数即可,详见该函数的定义
    [peaks] = findmainfreq(bjp);
    bjpvar = var(bjp); %边际谱的方差
    % 瞬时频率第三个和第四个分量的极值点的个数
    [indmin3, indmax3, indzer] = extr(infreq(3,:),1/fs);
    msize(1) = length(indmin3); % 第三个分量极大值点数
    msize(2) = length(indmax3); % 第三个分量极小值点数
    [indmin4, indmax4, indzer] = extr(infreq(4,:),1/fs);
    msize(3) = length(indmin4); % 第四个分量极大值点数
    msize(4) = length(indmax4); % 第四个分量极大值点数
    % 非有效特征,瞬时频率的均值、方差和有效值的特征对于好坏瓶子的区分性很差,所以不需要使用
    % 所有分量瞬时频率的均值、方差和有效值
    for k = 1:m-1
    % ave(k) = mean(infreq(k,:)); % 瞬时频率的均值
    mse(k) = var(infreq(k,:)); % 各分量的瞬时频率的方差
    % rms(k) = sqrt(sum((infreq(k,:) - ave(k)).^2)/N);% 各分量的瞬时频率的有效值
    end
    % 所有分量瞬时幅度的均值、方差和有效值
    for k = 1:m-1
    aveA(k) = mean(A(k,:)); % 瞬时幅度的均值
    mseA(k) = var(A(k,:)); % 各分量的瞬时幅度的方差
    rmsA(k) = sqrt(sum((A(k,:) - aveA(k)).^2)/N); % 各分量的瞬时幅度的有效值
    end
    % 所有分量的方差和
    msee = sum(mse);
    % 各分量的方差贡献率,此处只求前6个分量的方差贡献率
    for j = 1:6
    ratio(j) = (100*mse(j))/msee; %获取瞬时频率的方差贡献率
    end
    ratio1 = (100*mse(1))/msee; % 第一个分量的瞬时频率方差贡献率
    end

频域特征

  • 求出信号的频域特征参数

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    function [ area,peaks,loc ] = spectrum( frame )
    % spectrum:对一帧信号取频谱特征
    % 输入参数:frame:一帧信号,长度为256
    % 输出参数:area:频谱面积;peaks:频谱曲线峰值系数(最大5个):col:最大5个峰值系数对应的位置
    N = length(frame);
    [f amp] = FFT(frame,N);
    temp = amp(1:N/2)';
    area = polyarea(1:N/2,temp); %求频谱面积
    [K,V] = findpeaks(temp); %找出频谱峰值
    peaks = sort(K,'descend'); %降序排列峰值
    peaks = peaks(1:5); %取出前5大的峰值
    for i = 1:5
    mark = find(K == peaks(i));
    loc(i) = V(mark);
    end
    end
  • 直接求频域特征

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    function [ FC,MSF,VF,RMSF,RVF ] = frequency( frame )
    % frequency:求出一帧信号的频域特征参数
    % 输入参数:frame:一帧信号
    % 输出参数: FC:重心频率
    % MSF:均方频率
    % VF:频率方差
    % RMSF:均方根频率
    % RVF:频率标准差
    delta = 1/48000; % 采样间隔
    N = length(frame(:,1)); % 每帧信号的点数
    for i=2:N
    s(i,:) = (frame(i,:)-frame(i-1,:))/delta;
    end
    FC = sum(s(2:N,:).*frame(2:N,:))/(2*pi*sum(frame(:,:).^2));
    MSF = sum(s(2:N,:).^2)/(4*(pi^2)*sum(frame(:,:).^2));
    VF = MSF-(FC^2);
    RMSF = sqrt(MSF);
    RVF = sqrt(VF);
    end

参考:音频特征提取——常用音频特征

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/242807.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Invert Binary Tree

https://leetcode.com/problems/invert-binary-tree/ Invert a binary tree. 4 / \ 2 7 / \ / \ 1 3 6 9 to 4 / \ 7 2 / \ / \ 9 6 3 1 给出一棵二叉树&#xff0c;求这棵二叉树的镜像。 搬运九章上的实现 http://www.jiuzhang.com/solutions/invert-binary-tre…

虚拟机快照

虚拟机快照 虚拟机的删除和迁移 虚拟机的克隆

这些人,建议你不要去贷款了

贷款是好事&#xff0c;但是贷款还不上就不是好事了&#xff0c;在实际的贷款中&#xff0c;有很多人贷款都是没有目的性&#xff0c;纯粹是为了获取贷款而贷款&#xff0c;如果你是下面这些人&#xff0c;建议不要去贷款了。第一种人&#xff0c;贷款投机的人所谓投机就是为了…

特征选择方法

概述特征选择在模式识别领域中扮演着一个极其重要的角色。 一方面&#xff0c;在样本有限的情况下&#xff0c;用大量特征来设计分类器无论是从计算开销还是从分类器性能来看都不合时宜&#xff1b; 另一方面&#xff0c;特征和分类器性能之间并不存在线性关系&#xff0c;当特…

安装vmtools

安装vmtools Ubuntu 16.04 下安装VMware Tools(三行命令搞定&#xff0c;亲测好使)&#xff1a; 第一行命令&#xff1a;sudo apt-get upgrate 第二行命令&#xff1a;sudo apt-get install open-vm-tools-desktop -y 第三行命令&#xff1a;sudo rebootcd /opt/ 表示进入到op…

空间谱专题02:波束形成(Beamforming)

作者&#xff1a;桂。 时间&#xff1a;2017-08-22 10:56:45 链接&#xff1a;http://www.cnblogs.com/xingshansi/p/7410846.html 前言 本文主要记录常见的波束形成问题&#xff0c;可以说空间谱估计是波束形成基础上发展而来&#xff0c;在系统论述空间谱之前&#xff0c;有…

常见的矩阵形式

作者&#xff1a;桂。 时间&#xff1a;2017-08-22 12:30:33 链接&#xff1a;http://www.cnblogs.com/xingshansi/p/7411043.html 前言 记录经常用到的矩阵形式。 A-正交矩阵 定义&#xff1a;一实的正方矩阵Q∈Rnxn&#xff0c;称为正交矩阵&#xff0c;若&#xff1a; B-酉…

网上看的几点人生建议

在博客上看到一篇关于给二十几岁人的人生建议&#xff0c;觉得颇有道理&#xff0c;写一下关于这个感想&#xff0c;提醒现在和以后的你和自己。 人生路上&#xff0c;确实是一切都是未知的&#xff0c;你不知道你下一刻&#xff0c;面临的会是什么&#xff0c;我们无法预知未…

空间谱专题03:时空特性与采样定理

作者&#xff1a;桂。 时间&#xff1a;2017-08-27 08:07:30 链接&#xff1a;http://www.cnblogs.com/xingshansi/p/7439558.html 一、一阶无模糊特性 可结合时域、空域对偶性一文来理解。 在DOA ambiguity vs. array configuration for subspace-based DF method 一文&…

远程登录到Linux服务器

远程登录到Linux服务器 要求能够Ping通 第一步&#xff1a; 两边就可以互换文件了&#xff01;

采样定理

作者&#xff1a;桂。 时间&#xff1a;2017-08-28 19:09:42 链接&#xff1a;http://www.cnblogs.com/xingshansi/p/7445454.html 原文链接&#xff1a;http://pan.baidu.com/s/1nvFopuD 一、Nyquist采样定理 对于一个频带限制在&#xff08;0&#xff0c;fh&#xff09;的连…

信号分析中一些特征量

时域均值 有效值&#xff08;RMS&#xff0c;对时间的均值&#xff1a;&#xff09; 时域峰值 方差 协方差 短时能量 短时过零率 子频带能量比 频域概要&#xff1a;信号频谱是在频率域对原信号分布情况的描述&#xff0c;能够提供比时域波形更加直观的特征信息。频谱分析是机械…

Contains Duplicate II

https://leetcode.com/problems/contains-duplicate-ii/ Given an array of integers and an integer k, find out whether there are two distinct indices i and j in the array such that nums[i] nums[j] and the difference between i and j is at most k. 这道题目源自…

《现代语音信号处理》(胡航著)第1-6章简介

根据《现代语音信号处理》&#xff08;胡航版&#xff09;总大概列出前六章的内容&#xff0c;有些会有一些自己的理解和总结。 第一章 绪论发展史和主要研究内容及发展。第二章 语音信号处理的基础知识&#xff1a;语音信号处理的基础知识 语音的产生过程 语音信号的特性&…

时域、空域对偶性

厚着脸皮要在同事公众号上写篇文章&#xff0c;尽量浅显、与专业相关&#xff0c;选了这个主题。 一、时域与空域特性 以远场模型&#xff08;平面波&#xff09;为例&#xff0c;假设均匀线阵接收的为窄带信号&#xff0c;假设相邻振元间隔为d&#xff0c;入射角为&#xff1a…

开机重启,用户登录注销

开机重启&#xff0c;用户登录注销 用户管理 查询用户信息 用户组 在Linux下没有消息就是成功了&#xff08;没有消息就是好消息&#xff09;&#xff01; 用户和组相关文件

Power of Two

https://leetcode.com/problems/power-of-two/ Given an integer, write a function to determine if it is a power of two. 数字 2^n 是大于0的&#xff0c;而且等于1左移n位得到的数字&#xff0c;所以2^n与2^n-1 相与运算得到0. bool isPowerOfTwo(int n) {if(n < 0)…

DCASE2013挑战赛介绍

简介2013 年起&#xff0c;为了评测现有的环境声音检测方法&#xff0c;电子与电气工程师学会音频和声学信号处理协会(Institute of Electrical and Electronics Engineers Audio and Acoustic Signal Process, IEEE AASP )开始举办声学场景和事件的检测与分类挑战赛(Detection…

DCASE挑战赛原始提案文件(详细信息)

本文是根据DCASE2013挑战赛的提案文件&#xff0c;加上个人的理解做了相应的翻译&#xff0c;可能有不对的地方&#xff0c;在之后的会慢慢改善。 背景在过去的十年里&#xff0c;人们对在代码公布和公共评估中提出方法的语音和音频处理社区的兴趣越来越浓厚。公共评估可以作为…