精华内容
下载资源
问答
  • 基于MATLAB的数字信号处理(3) 用FFT对信号频谱分析

    万次阅读 多人点赞 2020-12-06 10:40:21
    基于MATLAB的数字信号处理, 用FFT对信号频谱分析。

    一、实验目的

    学习用 FFT 对连续信号和时域离散信号进行频谱分析(也称谱分析)的方法, 了解可能出现的分析误差及其原因,以便正确应用FFT。

    二、实验原理与方法

    • 用FFT对信号作频谱分析是学习数字信号处理的重要内容,经常需要进行谱分析的信号是模拟信号和时域离散信号,对信号进行谱分析的重要问题是频谱分辨率 D 和分析误差。
    • 频谱分辨率直接和 FFT 的变换区间 N 有关,因为FFT能够实现的频率分辨率是2π/N,因此要求2π/N≤D。可以根据此式选择 FFT 的变换区间N。误差主要来自于用 FFT 作频谱分析时,得到的是离散谱,而信号(周期信号除外)是连续谱,只有当 N 较大时离散谱的包络才能逼近于连续谱,因此 N 要适当选择大一些。
    • 周期信号的频谱是离散谱,只有用整数倍周期的长度作FFT,得到的离散谱才能代表周期信号的频谱。如果不知道信号周期,可以尽量选择信号的观察时间长一些。
    • 对模拟信号进行谱分析时,首先要按照采样定理将其变成时域离散信号。如果是模拟周期信号,也应该选取整数倍周期的长度,经过采样后形成周期序列,按照周期序列的谱分析进行。

    三、实验内容及步骤

    1. 有限长序列

    选择 FFT 的变换区间 N 为 8 和 16 的两种情况进行频谱分析。分别打印其幅频特性曲线, 并进行对比、 分析和讨论。

    %R4(n)的谱分析   有限长序列
    %做N点DFT  不够的话  时域补零到N点
    %8->16点  相邻谱线间隔变密  离散谱的包络更接近于连续谱
    clear;
    
    x1=[1 1 1 1];
    %8点DFT
    N1=8;
    xk=fft(x1,N1);   %计算x1(n)8点DFT
    subplot(221);         
    stem(0:N1-1,[x1 zeros(1,N1-4)],'.','g'); %时域补零到 8个点 绘图
    xlabel('n');
    ylabel('x(n)');
    title('R4(n)');
    axis([0 8 0 1.2]);
    
    subplot(222);
    stem(0:0.25:1.75,abs(xk),'.','g');   
    xlabel('\omega/\pi');
    ylabel('幅度');
    title('8点DFT的结果');
    axis([0 2 0 4.5]);
    
    %16点DTF
    N2=16;
    xk=fft(x1,N2);
    subplot(223);         
    stem(0:N2-1,[x1 zeros(1,N2-4)],'.','r'); %时域补零到16个点 绘图
    xlabel('n');
    ylabel('x(n)');
    title('R4(n)');
    axis([0 16 0 1.2]);
    
    subplot(224);
    stem(0:0.125:1.875,abs(xk),'.','r');  
    xlabel('\omega/\pi');
    ylabel('幅度');
    title('16点DFT的结果');
    axis([0 2 0 4.5]);
    

    运行效果如下:

    %x2(n)的谱分析
    %做N点DFT  不够的话  时域补零到N点
    
    clear;
    
    x2=[1 2 3 4 4 3 2 1];
    
    %8点DFT
    N1=8;
    subplot(221);         
    stem(0:N1-1,x2,'.','g'); 
    xlabel('n');
    ylabel('x(n)');
    title('x2(n)');
    axis([0 8 0 4.5]);
    
    xk=fft(x2,N1);
    subplot(222);
    stem(0:0.25:1.75,abs(xk),'.','g');   %归一化
    xlabel('\omega/\pi');
    ylabel('幅度');
    title('8点DFT的结果');
    axis([0 2 0 24]);
    
    %16点DFT
    N2=16;
    subplot(223);         
    stem(0:N2-1,[x2 zeros(1,N2-8)],'.','r');  %时域补零到16点
    xlabel('n');
    ylabel('x(n)');
    title('x2(n)');
    axis([0 16 0 4.5]);
    
    xk=fft(x2,N2);
    subplot(224);
    stem(0:0.125:1.875,abs(xk),'.','r');
    xlabel('\omega/\pi');
    ylabel('幅度');
    title('16点DFT的结果');
    axis([0 2 0 24]);
    
    

    运行效果如下:

    %x3(n)的频谱分析
    %做N点DFT  不够的话  时域补零到N点
    clear;
    
    x3=[4 3 2 1 1 2 3 4];
    
    %8点DFT
    N1=8;
    subplot(221);         
    stem(0:N1-1,x3,'.','g'); 
    xlabel('n');
    ylabel('x(n)');
    title('x3(n)');
    axis([0 8 0 4.5]);
    xk=fft(x3,N1);
    subplot(222);
    stem(0:0.25:1.75,abs(xk),'.','g');
    xlabel('\omega/\pi');
    ylabel('幅度');
    title('8点DFT的结果');
    axis([0 2 0 24]);
    
    %16点DFT
    N2=16;
    subplot(223);         
    stem(0:N2-1,[x3 zeros(1,N2-8)],'.','r'); %时域补零到16点
    xlabel('n');
    ylabel('x(n)');
    title('x3(n)');
    axis([0 16 0 4.5]);
    xk=fft(x3,N2);
    subplot(224);
    stem(0:0.125:1.875,abs(xk),'.','r');
    xlabel('\omega/\pi');
    ylabel('幅度');
    title('16点DFT的结果');
    axis([0 2 0 24]);
    

    运行效果如下:

    观察可以发现:

    • 由 MATLAB 绘图可以发现,N=8时,x2(n) 和 x3(n) 的幅频特性是相同的,因为x2(n)=x3((n-4))R8(n),循环移位关系,所以 x3(n) 与 x2(n) 的 DFT 的幅频特性相同,如图 (2a) 和 (3a) 所示
    • 但是,当 N=16时,x3(n) 与 x2(n) 就不满足循环移位关系了,所以如图 (2b) 和 (3b) 所示,幅频特性不同

    2. 周期序列


    选择 FFT 的变换区间 N 为 8 和 16 的两种情况分别对以上序列进行频谱分析,分别打印其幅频特性曲线。 并进行对比、分析和讨论。

    %x4(n)=cos(pi/4*n)的频谱分析   周期序列 
    %周期序列x(n)周期如果事先不知道 截取M点进行DFT  再将截取长度扩大一倍
    %比较二者主谱差别 若满足分析误差要求  这两个都可以近似表示x(n)的频谱
    %否则  继续将截取长度加倍  直到前后两次主谱差别满足误差要求
    %幅度跟N有关  主瓣会变窄 旁瓣会增加  更接近于真实的频谱 幅度是冲激那样的 又窄又高
    clear;
    
    n=0:31;
    x4=cos(pi/4*n);
    
    %8点DFT
    N1=8;
    subplot(221);         
    stem(0:1:31,x4,'.','g'); 
    xlabel('n');
    ylabel('x(n)');
    title('x4(n)');
    axis([0 31 -1.2 1.2]);
    
    xk=fft(x4,N1);
    subplot(222);
    stem(0:0.25:1.75,abs(xk),'.','g');
    xlabel('\omega/\pi');
    ylabel('幅度');
    title('8点DFT的结果');
    axis([0 2 0 5]);
    
    %16点DFT
    N2=16;
    subplot(223);         
    stem(0:1:31,x4,'.','r'); 
    xlabel('n');
    ylabel('x(n)');
    title('x4(n)');
    axis([0 31 -1.2 1.2]);
    
    xk=fft(x4,N2);
    subplot(224);
    stem(0:0.125:1.875,abs(xk),'.','r');
    xlabel('\omega/\pi');
    ylabel('幅度');
    title('16点DFT的结果');
    axis([0 2 0 9]);
    

    运行效果如下:

    %x5(n)=cos(pi/4*n)+cos(pi/8*n)的频谱分析
    %周期序列x(n)周期如果事先不知道 截取M点进行DFT  再将截取长度扩大一倍
    %比较二者主谱差别满足分析误差要求  这两个都可以近似表示x(n)的频谱
    %否则  继续将截取长度加倍  直到前后两次主谱差别满足误差要求
    clear;
    
    n=0:31;
    x5=cos(pi/4*n)+cos(pi/8*n);
    
    %8点DFT
    N1=8;
    subplot(321);         
    stem(0:1:31,x5,'.','m'); 
    xlabel('n');
    ylabel('x(n)');
    title('x5(n)');
    axis([0 31 -2.2 2.5]);
    
    xk=fft(x5,N1);
    subplot(322);
    stem(0:0.25:1.75,abs(xk),'.','m');
    xlabel('\omega/\pi');
    ylabel('幅度');
    title('8点DFT的结果');
    axis([0 2 0 7]);
    
    %16点DFT
    N2=16;
    subplot(323);         
    stem(0:1:31,x5,'.','r'); 
    xlabel('n');
    ylabel('x(n)');
    title('x5(n)');
    axis([0 31 -2.2 2.5]);
    
    xk=fft(x5,N2);
    subplot(324);
    stem(0:0.125:1.875,abs(xk),'.','r');
    xlabel('\omega/\pi');
    ylabel('幅度');
    title('16点DFT的结果');
    axis([0 2 0 10]);
    
    %32点DFT
    N2=32;
    subplot(325);         
    stem(0:1:31,x5,'.','g'); 
    xlabel('n');
    ylabel('x(n)');
    title('x5(n)');
    axis([0 31 -2.2 2.5]);
    
    xk=fft(x5,N2);
    subplot(326);
    stem(0:0.0625:1.9375,abs(xk),'.','g');
    xlabel('\omega/\pi');
    ylabel('幅度');
    title('32点DFT的结果');
    axis([0 2 0 20]);
    

    运行效果如下:

    • 对周期序列 x(n) 进行谱分析,如果事先不知道周期,可以先截取 M 点进行DFT ,再将截取长度扩大一倍,比较结果,如果二者的差别满足分析误差要求,则可以近似表示该信号的频谱,如果不满足误差要求就继续将截取长度加倍,重复比较,直到结果满足要求。
    • 幅度为N/2,N增大,主瓣会变窄,旁瓣会增加 ,更接近于真实的频谱,幅度是冲激那样的,又窄又高。

    3. 模拟周期信号

    %对模拟周期信号作谱分析  
    %首先要按照采样定理将其变成时域离散信号
    %如果是模拟周期信号, 也应该选取整数倍周期的长度, 经过采样后形成周期序列
    %再按照周期序列的谱分析进行
    clear;
    
    Fs=64;T=1/Fs;
    
    %先按照采样定理将模拟信号变成时域离散信号
    N=16;n=0:N-1; %FFT的变换区间 N=16
    x6nT=cos(8*pi*n*T)+cos(16*pi*n*T)+cos(20*pi*n*T); %对x6(t) 16点采样
    
    %fftshift移动零频点到频谱中间 为了把结果和fft运算的结果一致
    X6k16=fftshift(fft(x6nT,16)); %计算 x6nT 的16点 DFT  
    Tp=N*T;F=1/Tp;    %频率分辨率 F
    k=0:N-1;fk1=-32:4:28; %产生16点 DFT 对应的采样点频率(以零频率为中心)
    subplot(3,1,1);stem(fk1,abs(X6k16),'.','g'); %绘制16点DFT的幅频特性图
    title('16点 DFT[x_6(nT)]|');xlabel('\omega/\pi');ylabel('幅度');
    axis([-32 28 0 12]);
    
    N=32;n=0:N-1; %FFT 的变换区间 N=32
    x6nT=cos(8*pi*n*T)+cos(16*pi*n*T)+cos(20*pi*n*T); %对 x6(t) 32点采样
    X6k32=fftshift(fft(x6nT,32)); %计算x6(nT)32 点 DFT
    Tp=N*T;F=1/Tp;    %频率分辨率 F
    k=0:N-1;fk2=-32:2:30; %产生 32 点 DFT 对应的采样点频率(以零频率为中心)
    subplot(3,1,2);stem(fk2,abs(X6k32),'.','r'); %绘制 32 点 DFT 的幅频特性图
    title('32点 DFT[x_6(nT)]|');xlabel('\omega/\pi');ylabel('幅度');
    axis([-32 31 0 20]);
    
    N=64;n=0:N-1; %FFT 的变换区间 N=64
    x6nT=cos(8*pi*n*T)+cos(16*pi*n*T)+cos(20*pi*n*T); %对x6(t) 64点采样
    X6k64=fftshift(fft(x6nT,64)); %计算 x6(nT)64点DFT
    Tp=N*T;F=1/Tp;    %频率分辨率 F
    k=0:N-1;fk3=-32:1:31; %产生64点 DFT对应的采样点频率(以零频率为中心)
    subplot(3,1,3);stem(fk3,abs(X6k64),'.','m'); %绘制64点DFT的幅频特性图
    title('64点 DFT[x_6(nT)]|');xlabel('\omega/\pi');ylabel('幅度');
    axis([-32 31 0 40]);
    
    

    运行效果如下:

    四、回答思考题

    (1) 对于周期序列, 如果周期不知道, 如何用 FFT 进行谱分析?

    答:周期信号的周期预先不知道时,可先截取 M 点进行DFT,再将截取长度扩大一倍截取,比较结果,如果二者的差别满足分析误差要求,则可以近似表示该信号的频谱,如果不满足误差要求就继续将截取长度加倍,重复比较,直到结果满足要求。

    (2) 如何选择FFT的变换区间(包括非周期信号和周期信号)?

    答:对于非周期信号:有频谱分辨率F,而频谱分辨率直接和 FFT 的变换区间有关,因为 FFT 能够实现的频率分辨率是2π/N…因此有最小的N>2π/F。就可以根据此式选择 FFT 的变换区间。对于周期信号,周期信号的频谱是离散谱,只有用整数倍周期的长度作FFT,得到的离散谱才能代表周期信号的频谱。

    (3)当 N=8 时, x2 (n) 和 x3 (n)的幅频特性会相同吗?为什么?N=16时呢?

    • 由 MATLAB 绘图可以发现,N=8时,x2(n) 和 x3(n) 的幅频特性是相同的,因为x3(n)=x2((n+4))R8(n),为循环移位关系,所以 x3(n) 与 x2(n) 的DFT的幅频特性相同,如图 (2a) 和 (3a) 所示
    • 但是,当 N=16 时,x3(n) 与 x2(n) 就不满足循环移位关系了,所以如图 (2b) 和 (3b) 所示,幅频特性不同

    五、实验总结

    • 用 FFT 对信号作频谱分析是学习数字信号处理的重要内容,经常需要进行谱分析的信号是模拟信号和时域离散信号,对信号进行谱分析的重要问题是频谱分辨率 D 和分析误差。
    • 频谱分辨率直接和 FFT 的变换区间 N 有关,因为FFT能够实现的频率分辨率是2π/N,因此要求2π/N≤D。可以根据此式选择 FFT 的变换区间N。误差主要来自于用 FFT 作频谱分析时,得到的是离散谱,而信号(周期信号除外)是连续谱,只有当 N 较大时离散谱的包络才能逼近于连续谱,因此 N 要适当选择大一些。
    • 周期信号的频谱是离散谱,只有用整数倍周期的长度作FFT,得到的离散谱才能代表周期信号的频谱。如果不知道信号周期,可以尽量选择信号的观察时间长一些。
    • 对模拟信号进行谱分析时,首先要按照采样定理将其变成时域离散信号。如果是模拟周期信号,也应该选取整数倍周期的长度,经过采样后形成周期序列,按照周期序列的谱分析进行。
    展开全文
  • 处理数据平衡

    万次阅读 多人点赞 2018-09-06 12:44:57
    这几年来,机器学习和...在学术研究教学中,很多算法都有一个基本假设,那就是数据分布是均匀的。当我们把这些算法直接应用于实际数据时,大多数情况下都无法取得理想的结果。因为实际数据往往分布得很均匀,都...

    这几年来,机器学习和数据挖掘非常火热,它们逐渐为世界带来实际价值。与此同时,越来越多的机器学习算法从学术界走向工业界,而在这个过程中会有很多困难。数据不平衡问题虽然不是最难的,但绝对是最重要的问题之一。

    一、数据不平衡

    在学术研究与教学中,很多算法都有一个基本假设,那就是数据分布是均匀的。当我们把这些算法直接应用于实际数据时,大多数情况下都无法取得理想的结果。因为实际数据往往分布得很不均匀,都会存在“长尾现象”,也就是所谓的“二八原理”。下图是新浪微博交互分布情况:

     

    可以看到大部分微博的总互动数(被转发、评论与点赞数量)在0-5之间,交互数多的微博(多于100)非常之少。如果我们去预测一条微博交互数所在档位,预测器只需要把所有微博预测为第一档(0-5)就能获得非常高的准确率,而这样的预测器没有任何价值。那如何来解决机器学习中数据不平衡问题呢?这便是这篇文章要讨论的主要内容。

    严格地讲,任何数据集上都有数据不平衡现象,这往往由问题本身决定的,但我们只关注那些分布差别比较悬殊的;另外,虽然很多数据集都包含多个类别,但这里着重考虑二分类,因为解决了二分类中的数据不平衡问题后,推而广之就能得到多分类情况下的解决方案。综上,这篇文章主要讨论如何解决二分类中正负样本差两个及以上数量级情况下的数据不平衡问题。

    不平衡程度相同(即正负样本比例类似)的两个问题,解决的难易程度也可能不同,因为问题难易程度还取决于我们所拥有数据有多大。比如在预测微博互动数的问题中,虽然数据不平衡,但每个档位的数据量都很大——最少的类别也有几万个样本,这样的问题通常比较容易解决;而在癌症诊断的场景中,因为患癌症的人本来就很少,所以数据不但不平衡,样本数还非常少,这样的问题就非常棘手。综上,可以把问题根据难度从小到大排个序:大数据+分布均衡<大数据+分布不均衡<小数据+数据均衡<小数据+数据不均衡。说明:对于小数据集,机器学习的方法是比较棘手的。对于需要解决的问题,拿到数据后,首先统计可用训练数据有多大,然后再观察数据分布情况。经验表明,训练数据中每个类别有5000个以上样本,其实也要相对于特征而言,来判断样本数目是不是足够,数据量是足够的,正负样本差一个数量级以内是可以接受的,不太需要考虑数据不平衡问题(完全是经验,没有理论依据,仅供参考)。

    二、如何解决

    解决这一问题的基本思路是让正负样本在训练过程中拥有相同的话语权,比如利用采样与加权等方法。为了方便起见,我们把数据集中样本较多的那一类称为“大众类”,样本较少的那一类称为“小众类”。

    1. 采样

    采样方法是通过对训练集进行处理使其从不平衡的数据集变成平衡的数据集,在大部分情况下会对最终的结果带来提升。

    采样分为上采样(Oversampling)和下采样(Undersampling),上采样是把小众类复制多份,下采样是从大众类中剔除一些样本,或者说只从大众类中选取部分样本。

    随机采样最大的优点是简单,但缺点也很明显。上采样后的数据集中会反复出现一些样本,训练出来的模型会有一定的过拟合;而下采样的缺点显而易见,那就是最终的训练集丢失了数据,模型只学到了总体模式的一部分。

    上采样会把小众样本复制多份,一个点会在高维空间中反复出现,这会导致一个问题,那就是运气好就能分对很多点,否则分错很多点。为了解决这一问题,可以在每次生成新数据点时加入轻微的随机扰动,经验表明这种做法非常有效。

    因为下采样会丢失信息,如何减少信息的损失呢?第一种方法叫做EasyEnsemble,利用模型融合的方法(Ensemble):多次下采样(放回采样,这样产生的训练集才相互独立)产生多个不同的训练集,进而训练多个不同的分类器,通过组合多个分类器的结果得到最终的结果。第二种方法叫做BalanceCascade,利用增量训练的思想(Boosting):先通过一次下采样产生训练集,训练一个分类器,对于那些分类正确的大众样本不放回,然后对这个更小的大众样本下采样产生训练集,训练第二个分类器,以此类推,最终组合所有分类器的结果得到最终结果。第三种方法是利用KNN试图挑选那些最具代表性的大众样本,叫做NearMiss,这类方法计算量很大,感兴趣的可以参考“Learning from Imbalanced Data”这篇综述的3.2.1节。

    2. 数据合成

    数据合成方法是利用已有样本生成更多样本,这类方法在小数据场景下有很多成功案例,比如医学图像分析等。

     

    SMOTE为每个小众样本合成相同数量的新样本,这带来一些潜在的问题:一方面是增加了类之间重叠的可能性,另一方面是生成一些没有提供有益信息的样本。为了解决这个问题,出现两种方法:Borderline-SMOTE与ADASYN。

    Borderline-SMOTE的解决思路是寻找那些应该为之合成新样本的小众样本。即为每个小众样本计算K近邻,只为那些K近邻中有一半以上大众样本的小众样本生成新样本。直观地讲,只为那些周围大部分是大众样本的小众样本生成新样本,因为这些样本往往是边界样本。确定了为哪些小众样本生成新样本后再利用SMOTE生成新样本。

     

    横向是真实分类情况,纵向是预测分类情况,C(i,j)是把真实类别为j的样本预测为i时的损失,我们需要根据实际情况来设定它的值。

    这种方法的难点在于设置合理的权重,实际应用中一般让各个分类间的加权损失值近似相等。当然这并不是通用法则,还是需要具体问题具体分析。

    4. 一分类

    对于正负样本极不平衡的场景,我们可以换一个完全不同的角度来看待问题:把它看做一分类(One Class Learning)或异常检测(Novelty Detection)问题。这类方法的重点不在于捕捉类间的差别,而是为其中一类进行建模,经典的工作包括One-class SVM等。

    说明:对于正负样本极不均匀的问题,使用异常检测,或者一分类问题,也是一个思路。

    三、如何选择

    解决数据不平衡问题的方法有很多,上面只是一些最常用的方法,而最常用的方法也有这么多种,如何根据实际问题选择合适的方法呢?接下来谈谈一些我的经验。

    1、在正负样本都非常之少的情况下,应该采用数据合成的方式;

    2、在负样本足够多,正样本非常之少且比例及其悬殊的情况下,应该考虑一分类方法;

    3、在正负样本都足够多且比例不是特别悬殊的情况下,应该考虑采样或者加权的方法。

    4、采样和加权在数学上是等价的,但实际应用中效果却有差别。尤其是采样了诸如Random Forest等分类方法,训练过程会对训练集进行随机采样。在这种情况下,如果计算资源允许上采样往往要比加权好一些。

    5、另外,虽然上采样和下采样都可以使数据集变得平衡,并且在数据足够多的情况下等价,但两者也是有区别的。实际应用中,我的经验是如果计算资源足够且小众类样本足够多的情况下使用上采样,否则使用下采样,因为上采样会增加训练集的大小进而增加训练时间,同时小的训练集非常容易产生过拟合。

    6、对于下采样,如果计算资源相对较多且有良好的并行环境,应该选择Ensemble方法。

     

    原文地址:一只鸟的天空,http://blog.csdn.net/heyongluoyao8/article/details/49408131

    在分类中如何处理训练集中不平衡问题

      在很多机器学习任务中,训练集中可能会存在某个或某些类别下的样本数远大于另一些类别下的样本数目。即类别不平衡,为了使得学习达到更好的效果,因此需要解决该类别不平衡问题。

    Jason Brownlee的回答:

    原文标题:8 Tactics to Combat Imbalanced Classes in Your Machine Learning Dataset 
      当你在对一个类别不均衡的数据集进行分类时得到了90%的准确度(Accuracy)。当你进一步分析发现,数据集的90%的样本是属于同一个类,并且分类器将所有的样本都分类为该类。在这种情况下,显然该分类器是无效的。并且这种无效是由于训练集中类别不均衡而导致的。 
      首先举几个所收到的邮件中关于类别不均衡的例子:

    • 在一个二分类问题中,训练集中class 1的样本数比class 2的样本数是60:1。使用逻辑回归进行分类,最后结果是其忽略了class 2,即其将所有的训练样本都分类为class 1。
    • 在分类任务的数据集中,有三个类别,分别为A,B,C。在训练集中,A类的样本占70%,B类的样本占25%,C类的样本占5%。最后我的分类器对类A的样本过拟合了,而对其它两个类别的样本欠拟合。

    什么是类别不均衡问题

      类别数据不均衡是分类任务中一个典型的存在的问题。简而言之,即数据集中,每个类别下的样本数目相差很大。例如,在一个二分类问题中,共有100个样本(100行数据,每一行数据为一个样本的表征),其中80个样本属于class 1,其余的20个样本属于class 2,class 1:class2=80:20=4:1,这便属于类别不均衡。当然,类别不均衡问同样会发生在多分类任务中。它们的解决方法是一样的。因此,为了便于讨论与理解,我们从二分类任务入手进行讲解。

    类别不均衡问题是现实中很常见的问题

      大部分分类任务中,各类别下的数据个数基本上不可能完全相等,但是一点点差异是不会产生任何影响与问题的。 
      在现实中有很多类别不均衡问题,它是常见的,并且也是合理的,符合人们期望的。如,在欺诈交易识别中,属于欺诈交易的应该是很少部分,即绝大部分交易是正常的,只有极少部分的交易属于欺诈交易。这就是一个正常的类别不均衡问题。又如,在客户流失的数据集中,绝大部分的客户是会继续享受其服务的(非流失对象),只有极少数部分的客户不会再继续享受其服务(流失对象)。一般而已,如果类别不平衡比例超过4:1,那么其分类器会大大地因为数据不平衡性而无法满足分类要求的。因此在构建分类模型之前,需要对分类不均衡性问题进行处理。 
      在前面,我们使用准确度这个指标来评价分类质量,可以看出,在类别不均衡时,准确度这个评价指标并不能work。因为分类器将所有的样本都分类到大类下面时,该指标值仍然会很高。即,该分类器偏向了大类这个类别的数据。

    八大解决方法

    • 可以扩大数据集吗? 
        当遇到类别不均衡问题时,首先应该想到,是否可能再增加数据(一定要有小类样本数据),更多的数据往往战胜更好的算法。因为机器学习是使用现有的数据多整个数据的分布进行估计,因此更多的数据往往能够得到更多的分布信息,以及更好分布估计。即使再增加小类样本数据时,又增加了大类样本数据,也可以使用放弃一部分大类数据(即对大类数据进行欠采样)来解决。
    • 尝试其它评价指标 
        从前面的分析可以看出,准确度这个评价指标在类别不均衡的分类任务中并不能work,甚至进行误导(分类器不work,但是从这个指标来看,该分类器有着很好的评价指标得分)。因此在类别不均衡分类任务中,需要使用更有说服力的评价指标来对分类器进行评价。如何对不同的问题选择有效的评价指标参见这里。 
        上面的超链接中的文章,讲述了如何对乳腺癌患者复发类别不均衡数据进行分类。在文中,推荐了几个比传统的准确度更有效的评价指标:

      • 混淆矩阵(Confusion Matrix):使用一个表格对分类器所预测的类别与其真实的类别的样本统计,分别为:TP、FN、FP与TN。
      • 精确度(Precision)
      • 召回率(Recall)
      • F1得分(F1 Score):精确度与找召回率的加权平均。

        特别是:

    • 对数据集进行重采样 
        可以使用一些策略该减轻数据的不平衡程度。该策略便是采样(sampling),主要有两种采样方法来降低数据的不平衡性。

      • 对小类的数据样本进行采样来增加小类的数据样本个数,即过采样(over-sampling ,采样的个数大于该类样本的个数)。
      • 对大类的数据样本进行采样来减少该类数据样本的个数,即欠采样(under-sampling,采样的次数少于该类样本的个素)。

        采样算法往往很容易实现,并且其运行速度快,并且效果也不错。更详细的内容参见这里。 
        一些经验法则:

      • 考虑对大类下的样本(超过1万、十万甚至更多)进行欠采样,即删除部分样本;
      • 考虑对小类下的样本(不足1为甚至更少)进行过采样,即添加部分样本的副本;
      • 考虑尝试随机采样与非随机采样两种采样方法;
      • 考虑对各类别尝试不同的采样比例,比一定是1:1,有时候1:1反而不好,因为与现实情况相差甚远;
      • 考虑同时使用过采样与欠采样。
    • 尝试产生人工数据样本 
        一种简单的人工样本数据产生的方法便是,对该类下的所有样本每个属性特征的取值空间中随机选取一个组成新的样本,即属性值随机采样。你可以使用基于经验对属性值进行随机采样而构造新的人工样本,或者使用类似朴素贝叶斯方法假设各属性之间互相独立进行采样,这样便可得到更多的数据,但是无法保证属性之前的线性关系(如果本身是存在的)。 
        有一个系统的构造人工数据样本的方法SMOTE(Synthetic Minority Over-sampling Technique)。SMOTE是一种过采样算法,它构造新的小类样本而不是产生小类中已有的样本的副本,即该算法构造的数据是新样本,原数据集中不存在的。该基于距离度量选择小类别下两个或者更多的相似样本,然后选择其中一个样本,并随机选择一定数量的邻居样本对选择的那个样本的一个属性增加噪声,每次处理一个属性。这样就构造了更多的新生数据。具体可以参见原始论文。 
        这里有SMOTE算法的多个不同语言的实现版本: 
    • 尝试不同的分类算法 
        强烈建议不要对待每一个分类都使用自己喜欢而熟悉的分类算法。应该使用不同的算法对其进行比较,因为不同的算法使用于不同的任务与数据。具体可以参见“Why you should be Spot-Checking Algorithms on your Machine Learning Problems”。 
        决策树往往在类别不均衡数据上表现不错。它使用基于类变量的划分规则去创建分类树,因此可以强制地将不同类别的样本分开。目前流行的决策树算法有:C4.5、C5.0、CART和Random Forest等。基于R编写的决策树参见这里。基于Python的Scikit-learn的CART使用参见这里
    • 尝试对模型进行惩罚 
        你可以使用相同的分类算法,但是使用一个不同的角度,比如你的分类任务是识别那些小类,那么可以对分类器的小类样本数据增加权值,降低大类样本的权值(这种方法其实是产生了新的数据分布,即产生了新的数据集,译者注),从而使得分类器将重点集中在小类样本身上。一个具体做法就是,在训练分类器时,若分类器将小类样本分错时额外增加分类器一个小类样本分错代价,这个额外的代价可以使得分类器更加“关心”小类样本。如penalized-SVM和penalized-LDA算法。 
        Weka中有一个惩罚模型的通用框架CostSensitiveClassifier,它能够对任何分类器进行封装,并且使用一个自定义的惩罚矩阵对分错的样本进行惩罚。 
        如果你锁定一个具体的算法时,并且无法通过使用重采样来解决不均衡性问题而得到较差的分类结果。这样你便可以使用惩罚模型来解决不平衡性问题。但是,设置惩罚矩阵是一个复杂的事,因此你需要根据你的任务尝试不同的惩罚矩阵,并选取一个较好的惩罚矩阵。
    • 尝试一个新的角度理解问题 
        我们可以从不同于分类的角度去解决数据不均衡性问题,我们可以把那些小类的样本作为异常点(outliers),因此该问题便转化为异常点检测(anomaly detection)与变化趋势检测问题(change detection)。 
        异常点检测即是对那些罕见事件进行识别。如通过机器的部件的振动识别机器故障,又如通过系统调用序列识别恶意程序。这些事件相对于正常情况是很少见的。 
        变化趋势检测类似于异常点检测,不同在于其通过检测不寻常的变化趋势来识别。如通过观察用户模式或银行交易来检测用户行为的不寻常改变。 
        将小类样本作为异常点这种思维的转变,可以帮助考虑新的方法去分离或分类样本。这两种方法从不同的角度去思考,让你尝试新的方法去解决问题。
    • 尝试创新 
        仔细对你的问题进行分析与挖掘,是否可以将你的问题划分成多个更小的问题,而这些小问题更容易解决。你可以从这篇文章In classification, how do you handle an unbalanced training set?中得到灵感。例如: 
      • 将你的大类压缩成小类;
      • 使用One Class分类器(将小类作为异常点);
      • 使用集成方式,训练多个分类器,然后联合这些分类器进行分类;
      • ….

      这些想法只是冰山一角,你可以想到更多的有趣的和有创意的想法去解决问题。更多的想法参加Reddit的文章http://www.quora.com/In-classification-how-do-you-handle-an-unbalanced-training-set

    选择某一种方法并使用它

      你不必成为一个精通所有算法的算法奇才或者一个建立准确而可靠的处理数据不平衡的模型的统计学家,你只需要根据你的问题的实际情况从上述算法或方法中去选择一种或两种方法去使用。希望上述的某些方法能够解决你的问题。例如使用其它评价指标或重采样算法速度快并且有效。

    总结

      记住,其实并不知道哪种方法最适合你的任务与数据,你可以使用一些启发式规则或经验去选择某一个较优算法。当然最好的方法测试每一种算法,然后选择最好的方法。最重要的是,从点滴开始做起,根据自己现有的知识,并不断学习去一步步完善。

    Further Reading…

      这里有一些我认为有价值的可供参考的相关资料,让你进一步去认识与研究数据不平衡问题:

    Sergey Feldman的回答:

    • 设超大类中样本的个数是极小类中样本个数的L倍,那么在随机梯度下降(SGD,stochastic gradient descent)算法中,每次遇到一个极小类中样本进行训练时,训练L次。
    • 将大类中样本划分到L个聚类中,然后训练L个分类器,每个分类器使用大类中的一个簇与所有的小类样本进行训练得到。最后对这L个分类器采取少数服从多数对未知类别数据进行分类,如果是连续值(预测),那么采用平均值。
    • 设小类中有N个样本。将大类聚类成N个簇,然后使用每个簇的中心组成大类中的N个样本,加上小类中所有的样本进行训练。
    • 无论你使用前面的何种方法,都对某个或某些类进行了损害。为了不进行损害,那么可以使用全部的训练集采用多种分类方法分别建立分类器而得到多个分类器,采用投票的方式对未知类别的数据进行分类,如果是连续值(预测),那么采用平均值。
    • 最近的ICML论文中,表明增加数据量使得已知分布的训练集的误差增加了,即破坏了原有训练集的分布,从而可以提高分类器的性能。这篇论文与类别不平衡问题不相关,因为它隐式地使用数学方式增加数据而使得数据集大小不变。但是,我认为破坏原有的分布是有益的。
    • More details than you need: imho, the most interesting of the corrupting distributions is the blankout distribution, where you just zero out a random subset of features. Why is it interesting? Because you are helping your classifier be sturdier/hardier by giving it variations of your data that have essentially missing features. So it has to learn to classify correctly even in adverse conditions. 一个相关的想法是,在神经网络中,随机选择部分隐藏层单元来继续训练(即,随机去掉一部分隐藏层单元,(zeroed-out))。具体见http://web.stanford.edu/~sidaw/cgi-bin/home/lib/exe/fetch.php?media=papers:fastdropout.pdf

    Kripa Chettiar的回答:

    • 增加新数据,可以使用SMOTE或SMOTEBoost产生人造数据。
    • 将大类压缩。压缩比例需要具体情况具体分析,取决于你所拥有的数据。例如,A类中有30个样本,B类中有4000个样本,那么你可以将B类压缩成1000(进行采样)。
    • 可以结合1与2
    • 对于那种极小类是异常点的分类任务,因此分类器需要学习到大类的决策分界面,即分类器是一个单个类分类器(One Class Classifier)。Weka中有相关的库
    • 获得更多的数据。

    Roar Nybø的回答:

    • 对小类进行过采样。并且使用集成模式会获得更好的效果。

    Dan Levin的回答:

    • 一个很好的方法去处理非平衡数据问题,并且在理论上证明了。这个方法便是由Robert E. Schapire于1990年在Machine Learning提出的”The strength of weak learnability” ,该方法是一个boosting算法,它递归地训练三个弱学习器,然后将这三个弱学习器结合起形成一个强的学习器。我们可以使用这个算法的第一步去解决数据不平衡问题。 
        首先使用原始数据集训练第一个学习器L1。 
        然后使用50%在L1学习正确和50%学习错误的的那些样本训练得到学习器L2,即从L1中学习错误的样本集与学习正确的样本集中,循环一边采样一个。 
        接着,使用L1与L2不一致的那些样本去训练得到学习器L3。 
        最后,使用投票方式作为最后输出。 
        那么如何使用该算法来解决类别不平衡问题呢? 
        假设是一个二分类问题,大部分的样本都是true类。让L1输出始终为true。使用50%在L1分类正确的与50%分类错误的样本训练得到L2,即从L1中学习错误的样本集与学习正确的样本集中,循环一边采样一个。因此,L2的训练样本是平衡的。L使用L1与L2分类不一致的那些样本训练得到L3,即在L2中分类为false的那些样本。最后,结合这三个分类器,采用投票的方式来决定分类结果,因此只有当L2与L3都分类为false时,最终结果才为false,否则true。 
        自己已经在实践中使用过很多次,并且效果都不错。

    Kaushik Kasi的回答:

    • 对小类中的样本进行复制以增加该类中的样本数,但是可能会增加bias。
    • 对小类中的样本通过调整特征值来人工生成样本,而使得该类中样本个数增多。如在图像中,对一幅图像进行扭曲得到另一幅图像,即改变了原图像的某些特征值。但是该方法可能会产生现实中并存在的样本。

    Quora User的回答:

    • 简单快速的方法:对大类欠采样或者对小类过采样。
    • 更有效的方法:使用代价函数学习得到每个类的权值,大类的权值小,小类的权值大。刚开始,可以设置每个类别的权值与样本个数比例的倒数,然后可以使用过采样进行调优。

    Dayvid Victor的回答:

      在类别不平衡中,以下几个点需要注意:

    • 常规的分类评价指标可能会失效,比如将所有的样本都分类成大类,那么准确率、精确率等都会很高。这种情况下,AUC时最好的评价指标。
    • 你能够使用原型选择技术去降低不平衡水平。选择那些重要的样本。One-Sided Selection (OSS) 是一个预处理技术(模型训练之前使用),能够处理类别不平衡问题。
    • 从另一个角度,可以增加小类的样本个数,可以使用过采样与原型生成技术(prototype-generation techniques)。
    • 在K-Fold 校验中,每一份数据集中原则上应该保持类别样本比例一样或者近似,如果每份数据集中小类样本数目过少,那么应该降低K的值,知道小类样本的个数足够。 
        一般来说,如果事前不对不平衡问题进行处理,那么对于小类别的样本则会错误率很高,即大部分甚至全部小类样本都会分错。

    Muktabh Mayank的回答:

    Sandeep Subramanian的回答:

    Quora User的回答:

    • 赋予小类样本更高的训练权值
    • 对小类进行过采样
    • 某些时候,高不平衡性下仍然可以得到效果较好的训练结果。我认为对于某些评价指标是有意义的,如AUC。

    Sumit Soman 的回答:

    Abhishek Ghose的回答:

      参见:Abhishek Ghose’s answer to What’s the most efficient classification algorithm for unbalanced data sets? And what pre-processing could be done to optimize the score?

    原文:https://www.quora.com/In-classification-how-do-you-handle-an-unbalanced-training-set

     
    展开全文
  • 大牛讲解信号系统以及数字信号处理

    万次阅读 多人点赞 2018-06-13 21:27:03
    第一课 什么是卷积 卷积有什么用 什么是傅利叶变换 什么是拉普拉斯变换引子很多朋友和我一样,...)讲一个故事:张三刚刚应聘到了一个电子产品公司测试人员,他没有学过"信号系统"这门课程。一天,他...

    第一课 什么是卷积 卷积有什么用 什么是傅利叶变换 什么是拉普拉斯变换

    引子
    很多朋友和我一样,工科电子类专业,学了一堆信号方面的课,什么都没学懂,背了公式考了试,然后毕业了。

    先说"卷积有什么用"这个问题。(有人抢答,"卷积"是为了学习"信号与系统"这门课的后续章节而存在的。我大吼一声,把他拖出去枪毙!)

    讲一个故事:
    张三刚刚应聘到了一个电子产品公司做测试人员,他没有学过"信号与系统"这门课程。一天,他拿到了一个产品,开发人员告诉他,产品有一个输入端,有一个输出端,有限的输入信号只会产生有限的输出。
    然后,经理让张三测试当输入sin(t)(t<1秒)信号的时候(有信号发生器),该产品输出什么样的波形。张三照做了,花了一个波形图。
    "很好!"经理说。然后经理给了张三一叠A4纸: "这里有几千种信号,都用公式说明了,输入信号的持续时间也是确定的。你分别测试以下我们产品的输出波形是什么吧!"

    这下张三懵了,他在心理想"上帝,帮帮我把,我怎么画出这些波形图呢?"
    于是上帝出现了: "张三,你只要做一次测试,就能用数学的方法,画出所有输入波形对应的输出波形"。
    上帝接着说:"给产品一个脉冲信号,能量是1焦耳,输出的波形图画出来!"
    张三照办了,"然后呢?"
    上帝又说,"对于某个输入波形,你想象把它微分成无数个小的脉冲,输入给产品,叠加出来的结果就是你的输出波形。你可以想象这些小脉冲排着队进入你的产品,每个产生一个小的输出,你画出时序图的时候,输入信号的波形好像是反过来进入系统的。"
    张三领悟了:" 哦,输出的结果就积分出来啦!感谢上帝。这个方法叫什么名字呢?"
    上帝说:"叫卷积!"

    从此,张三的工作轻松多了。每次经理让他测试一些信号的输出结果,张三都只需要在A4纸上做微积分就是提交任务了!
    ----------------------------------------
    张三愉快地工作着,直到有一天,平静的生活被打破。
    经理拿来了一个小的电子设备,接到示波器上面,对张三说: "看,这个小设备产生的波形根本没法用一个简单的函数来说明,而且,它连续不断的发出信号!不过幸好,这个连续信号是每隔一段时间就重复一次的。张三,你 来测试以下,连到我们的设备上,会产生什么输出波形!"
    张三摆摆手:"输入信号是无限时长的,难道我要测试无限长的时间才能得到一个稳定的,重复的波形输出吗?"
    经理怒了:"反正你给我搞定,否则炒鱿鱼!"
    张三心想:"这次输入信号连公式都给出出来,一个很混乱的波形;时间又是无限长的,卷积也不行了,怎么办呢?"
    及时地,上帝又出现了:"把混乱的时间域信号映射到另外一个数学域上面,计算完成以后再映射回来"
    "宇宙的每一个原子都在旋转和震荡,你可以把时间信号看成若干个震荡叠加的效果,也就是若干个可以确定的,有固定频率特性的东西。"
    "我给你一个数学函数f,时间域无限的输入信号在f域有限的。时间域波形混乱的输入信号在f域是整齐的容易看清楚的。这样你就可以计算了"
    "同时,时间域的卷积在f域是简单的相乘关系,我可以证明给你看看"
    "计算完有限的程序以后,取f(-1)反变换回时间域,你就得到了一个输出波形,剩下的就是你的数学计算了!"
    张三谢过了上帝,保住了他的工作。后来他知道了,f域的变换有一个名字,叫做傅利叶,什么什么... ...
    ----------------------------------------
    再后来,公司开发了一种新的电子产品,输出信号是无限时间长度的。这次,张三开始学拉普拉斯了......

    后记:

    不是我们学的不好,是因为教材不好,老师讲的也不好。
    很欣赏Google的面试题: 用3句话像老太太讲清楚什么是数据库。这样的命题非常好,因为没有深入的理解一个命题,没有仔细的思考一个东西的设计哲学,我们就会陷入细节的泥沼: 背公式,数学推导,积分,做题;而没有时间来回答"为什么要这样"。做大学老师的做不到"把厚书读薄"这一点,讲不出哲学层面的道理,一味背书和翻讲 ppt,做着枯燥的数学证明,然后责怪"现在的学生一代不如一代",有什么意义吗?


    第二课 到底什么是频率 什么是系统?

    这一篇,我展开的说一下傅立叶变换F。注意,傅立叶变换的名字F可以表示频率的概念(freqence),也可以包括其他任何概念,因为它只是一个概念模 型,为了解决计算的问题而构造出来的(例如时域无限长的输入信号,怎么得到输出信号)。我们把傅立叶变换看一个C语言的函数,信号的输出输出问题看为IO 的问题,然后任何难以求解的x->y的问题都可以用x->f(x)->f-1(x)->y来得到。

    1. 到底什么是频率?
    一个基本的假设: 任何信息都具有频率方面的特性,音频信号的声音高低,光的频谱,电子震荡的周期,等等,我们抽象出一个件谐振动的概念,数学名称就叫做频率。想象在x-y 平面上有一个原子围绕原点做半径为1匀速圆周运动,把x轴想象成时间,那么该圆周运动在y轴上的投影就是一个sin(t)的波形。相信中学生都能理解这 个。
    那么,不同的频率模型其实就对应了不同的圆周运动速度。圆周运动的速度越快,sin(t)的波形越窄。频率的缩放有两种模式
    (a) 老式的收音机都是用磁带作为音乐介质的,当我们快放的时候,我们会感觉歌唱的声音变得怪怪的,调子很高,那是因为"圆周运动"的速度增倍了,每一个声音分量的sin(t)输出变成了sin(nt)。
    (b) 在CD/计算机上面快放或满放感觉歌手快唱或者慢唱,不会出现音调变高的现象:因为快放的时候采用了时域采样的方法,丢弃了一些波形,但是承载了信息的输出波形不会有宽窄的变化;满放时相反,时域信号填充拉长就可以了。

    2. F变换得到的结果有负数/复数部分,有什么物理意义吗?
    解释: F变换是个数学工具,不具有直接的物理意义,负数/复数的存在只是为了计算的完整性。

    3. 信号与系统这们课的基本主旨是什么?
    对于通信和电子类的学生来说,很多情况下我们的工作是设计或者OSI七层模型当中的物理层技术,这种技术的复杂性首先在于你必须确立传输介质的电气特 性,通常不同传输介质对于不同频率段的信号有不同的处理能力。以太网线处理基带信号,广域网光线传出高频调制信号,移动通信,2G和3G分别需要有不同的 载频特性。那么这些介质(空气,电线,光纤等)对于某种频率的输入是否能够在传输了一定的距离之后得到基本不变的输入呢? 那么我们就要建立介质的频率相应数学模型。同时,知道了介质的频率特性,如何设计在它上面传输的信号才能大到理论上的最大传输速率?----这就是信号与 系统这们课带领我们进入的一个世界。
    当然,信号与系统的应用不止这些,和香农的信息理论挂钩,它还可以用于信息处理(声音,图像),模式识别,智能控制等领域。如果说,计算机专业的课程是 数据表达的逻辑模型,那么信号与系统建立的就是更底层的,代表了某种物理意义的数学模型。数据结构的知识能解决逻辑信息的编码和纠错,而信号的知识能帮我 们设计出码流的物理载体(如果接受到的信号波形是混乱的,那我依据什么来判断这个是1还是0? 逻辑上的纠错就失去了意义)。在工业控制领域,计算机的应用前提是各种数模转换,那么各种物理现象产生的连续模拟信号(温度,电阻,大小,压力,速度等) 如何被一个特定设备转换为有意义的数字信号,首先我们就要设计一个可用的数学转换模型。

    4. 如何设计系统?
    设计物理上的系统函数(连续的或离散的状态),有输入,有输出,而中间的处理过程和具体的物理实现相关,不是这们课关心的重点(电子电路设计?)。信号 与系统归根到底就是为了特定的需求来设计一个系统函数。设计出系统函数的前提是把输入和输出都用函数来表示(例如sin(t))。分析的方法就是把一个复 杂的信号分解为若干个简单的信号累加,具体的过程就是一大堆微积分的东西,具体的数学运算不是这门课的中心思想。
    那么系统有那些种类呢?
    (a) 按功能分类: 调制解调(信号抽样和重构),叠加,滤波,功放,相位调整,信号时钟同步,负反馈锁相环,以及若干子系统组成的一个更为复杂的系统----你可以画出系统 流程图,是不是很接近编写程序的逻辑流程图? 确实在符号的空间里它们没有区别。还有就是离散状态的数字信号处理(后续课程)。
    (b) 按系统类别划分,无状态系统,有限状态机,线性系统等。而物理层的连续系统函数,是一种复杂的线性系统。

    5. 最好的教材?
    符号系统的核心是集合论,不是微积分,没有集合论构造出来的系统,实现用到的微积分便毫无意义----你甚至不知道运算了半天到底是要作什么。以计算机的观点来学习信号与系统,最好的教材之一就是<>, 作者是UC Berkeley的Edward A.Lee and Pravin Varaiya----先定义再实现,符合人类的思维习惯。国内的教材通篇都是数学推导,就是不肯说这些推导是为了什么目的来做的,用来得到什么,建设什 么,防止什么;不去从认识论和需求上讨论,通篇都是看不出目的的方法论,本末倒置了。

    第三课 抽样定理是干什么的

    1. 举个例子,打电话的时候,电话机发出的信号是PAM脉冲调幅,在电话线路上传的不是话音,而是话音通过信道编码转换后的脉冲序列,在收端恢复语音波形。那 么对于连续的说话人语音信号,如何转化成为一些列脉冲才能保证基本不失真,可以传输呢? 很明显,我们想到的就是取样,每隔M毫秒对话音采样一次看看电信号振幅,把振幅转换为脉冲编码,传输出去,在收端按某种规则重新生成语言。
    那么,问题来了,每M毫秒采样一次,M多小是足够的? 在收端怎么才能恢复语言波形呢?
    对于第一个问题,我们考虑,语音信号是个时间频率信号(所以对应的F变换就表示时间频率)把语音信号分解为若干个不同频率的单音混合体(周期函数的复利叶 级数展开,非周期的区间函数,可以看成补齐以后的周期信号展开,效果一样),对于最高频率的信号分量,如果抽样方式能否保证恢复这个分量,那么其他的低频 率分量也就能通过抽样的方式使得信息得以保存。如果人的声音高频限制在3000Hz,那么高频分量我们看成sin(3000t),这个sin函数要通过抽 样保存信息,可以看为: 对于一个周期,波峰采样一次,波谷采样一次,也就是采样频率是最高频率分量的2倍(奈奎斯特抽样定理),我们就可以通过采样信号无损的表示原始的模拟连续 信号。这两个信号一一对应,互相等价。
    对于第二个问题,在收端,怎么从脉冲序列(梳装波形)恢复模拟的连续信号呢? 首先,我们已经肯定了在频率域上面的脉冲序列已经包含了全部信息,但是原始信息只在某一个频率以下存在,怎么做? 我们让输入脉冲信号I通过一个设备X,输出信号为原始的语音O,那么I(*)X=O,这里(*)表示卷积。时域的特性不好分析,那么在频率域 F(I)*F(X)=F(O)相乘关系,这下就很明显了,只要F(X)是一个理想的,低通滤波器就可以了(在F域画出来就是一个方框),它在时间域是一个 钟型函数(由于包含时间轴的负数部分,所以实际中不存在),做出这样的一个信号处理设备,我们就可以通过输入的脉冲序列得到几乎理想的原始的语音。在实际 应用中,我们的抽样频率通常是奈奎斯特频率再多一点,3k赫兹的语音信号,抽样标准是8k赫兹。
    2. 再举一个例子,对于数字图像,抽样定理对应于图片的分辨率----抽样密度越大,图片的分辨率越高,也就越清晰。如果我们的抽样频率不够,信息就会发生混 叠----网上有一幅图片,近视眼戴眼镜看到的是爱因斯坦,摘掉眼睛看到的是梦露----因为不带眼睛,分辨率不够(抽样频率太低),高频分量失真被混入 了低频分量,才造成了一个视觉陷阱。在这里,图像的F变化,对应的是空间频率。
    话说回来了,直接在信道上传原始语音信号不好吗? 模拟信号没有抗干扰能力,没有纠错能力,抽样得到的信号,有了数字特性,传输性能更佳。
    什么信号不能理想抽样? 时域有跳变,频域无穷宽,例如方波信号。如果用有限带宽的抽样信号表示它,相当于复利叶级数取了部分和,而这个部分和在恢复原始信号的时候,在不可导的点上面会有毛刺,也叫吉布斯现象。
    3. 为什么傅立叶想出了这么一个级数来? 这个源于西方哲学和科学的基本思想: 正交分析方法。例如研究一个立体形状,我们使用x,y,z三个互相正交的轴: 任何一个轴在其他轴上面的投影都是0。这样的话,一个物体的3视图就可以完全表达它的形状。同理,信号怎么分解和分析呢? 用互相正交的三角函数分量的无限和:这就是傅立叶的贡献。

    入门第四课 傅立叶变换的复数 小波

    说的广义一点,"复数"是一个"概念",不是一种客观存在。
    什么是"概念"? 一张纸有几个面? 两个,这里"面"是一个概念,一个主观对客观存在的认知,就像"大"和"小"的概念一样,只对人的意识有意义,对客观存在本身没有意义(康德: 纯粹理性的批判)。把纸条的两边转一下相连接,变成"莫比乌斯圈",这个纸条就只剩下一个"面"了。概念是对客观世界的加工,反映到意识中的东西。
    数的概念是这样被推广的: 什么数x使得x^2=-1? 实数轴显然不行,(-1)*(-1)=1。那么如果存在一个抽象空间,它既包括真实世界的实数,也能包括想象出来的x^2=-1,那么我们称这个想象空间 为"复数域"。那么实数的运算法则就是复数域的一个特例。为什么1*(-1)=-1? +-符号在复数域里面代表方向,-1就是"向后,转!"这样的命令,一个1在圆周运动180度以后变成了-1,这里,直线的数轴和圆周旋转,在复数的空间 里面被统一了。
    因此,(-1)*(-1)=1可以解释为"向后转"+"向后转"=回到原地。那么复数域如何表示x^2=-1呢? 很简单,"向左转","向左转"两次相当于"向后转"。由于单轴的实数域(直线)不包含这样的元素,所以复数域必须由两个正交的数轴表示--平面。很明 显,我们可以得到复数域乘法的一个特性,就是结果的绝对值为两个复数绝对值相乘,旋转的角度=两个复数的旋转角度相加。高中时代我们就学习了迪莫弗定理。 为什么有这样的乘法性质? 不是因为复数域恰好具有这样的乘法性质(性质决定认识),而是发明复数域的人就是根据这样的需求去弄出了这么一个复数域(认识决定性质),是一种主观唯心 主义的研究方法。为了构造x^2=-1,我们必须考虑把乘法看为两个元素构成的集合: 乘积和角度旋转。
    因为三角函数可以看为圆周运动的一种投影,所以,在复数域,三角函数和乘法运算(指数)被统一了。我们从实数域的傅立叶级数展开入手,立刻可以得到形式更 简单的,复数域的,和实数域一一对应的傅立叶复数级数。因为复数域形式简单,所以研究起来方便----虽然自然界不存在复数,但是由于和实数域的级数一一 对应,我们做个反映射就能得到有物理意义的结果。
    那么傅立叶变换,那个令人难以理解的转换公式是什么含义呢? 我们可以看一下它和复数域傅立叶级数的关系。什么是微积分,就是先微分,再积分,傅立叶级数已经作了无限微分了,对应无数个离散的频率分量冲击信号的和。 傅立叶变换要解决非周期信号的分析问题,想象这个非周期信号也是一个周期信号: 只是周期为无穷大,各频率分量无穷小而已(否则积分的结果就是无穷)。那么我们看到傅立叶级数,每个分量常数的求解过程,积分的区间就是从T变成了正负无 穷大。而由于每个频率分量的常数无穷小,那么让每个分量都去除以f,就得到有值的数----所以周期函数的傅立叶变换对应一堆脉冲函数。同理,各个频率分 量之间无限的接近,因为f很小,级数中的f,2f,3f之间几乎是挨着的,最后挨到了一起,和卷积一样,这个复数频率空间的级数求和最终可以变成一个积分 式:傅立叶级数变成了傅立叶变换。注意有个概念的变化:离散的频率,每个频率都有一个"权"值,而连续的F域,每个频率的加权值都是无穷小(面积=0), 只有一个频率范围内的"频谱"才对应一定的能量积分。频率点变成了频谱的线。

    因此傅立叶变换求出来的是一个通常是一个连续函数,是复数频率域上面的可以画出图像的东西? 那个根号2Pai又是什么? 它只是为了保证正变换反变换回来以后,信号不变。我们可以让正变换除以2,让反变换除以Pi,怎么都行。慢点,怎么有"负数"的部分,还是那句话,是数轴 的方向对应复数轴的旋转,或者对应三角函数的相位分量,这样说就很好理解了。有什么好处? 我们忽略相位,只研究"振幅"因素,就能看到实数频率域内的频率特性了。
    我们从实数(三角函数分解)->复数(e和Pi)->复数变换(F)->复数反变换(F-1)->复数(取幅度分量)-> 实数,看起来很复杂,但是这个工具使得,单从实数域无法解决的频率分析问题,变得可以解决了。两者之间的关系是: 傅立叶级数中的频率幅度分量是a1-an,b1-bn,这些离散的数表示频率特性,每个数都是积分的结果。而傅立叶变换的结果是一个连续函数: 对于f域每个取值点a1-aN(N=无穷),它的值都是原始的时域函数和一个三角函数(表示成了复数)积分的结果----这个求解和级数的表示形式是一样 的。不过是把N个离散的积分式子统一为了一个通用的,连续的积分式子。

    复频域,大家都说画不出来,但是我来画一下!因为不是一个图能够表示清楚的。我用纯中文来说:
    1. 画一个x,y轴组成的平面,以原点为中心画一个圆(r=1)。再画一条竖直线: (直线方程x=2),把它看成是一块挡板。
    2. 想象,有一个原子,从(1,0)点出发,沿着这个圆作逆时针匀速圆周运动。想象太阳光从x轴的复数方向射向x轴的正数方向,那么这个原子运动在挡板(x=2)上面的投影,就是一个简协震动。
    3. 再修改一下,x=2对应的不是一个挡板,而是一个打印机的出纸口,那么,原子运动的过程就在白纸上画下了一条连续的sin(t)曲线!
    上面3条说明了什么呢? 三角函数和圆周运动是一一对应的。如果我想要sin(t+x),或者cos(t)这种形式,我只需要让原子的起始位置改变一下就可以了:也就是级坐标的向量,半径不变,相位改变。
    傅立叶级数的实数展开形式,每一个频率分量都表示为AnCos(nt)+BnSin(nt),我们可以证明,这个式子可以变成 sqr(An^2+Bn^2)sin(nt+x)这样的单个三角函数形式,那么:实数值对(An,Bn),就对应了二维平面上面的一个点,相位x对应这个 点的相位。实数和复数之间的一一对应关系便建立起来了,因此实数频率唯一对应某个复数频率,我们就可以用复数来方便的研究实数的运算:把三角运算变成指数 和乘法加法运算。
    -------------------------------------------------------------------------
    但是,F变换仍然是有限制的(输入函数的表示必须满足狄义赫立条件等),为了更广泛的使用"域"变换的思想来表示一种"广义"的频率信息,我们就发明出了 拉普拉斯变换,它的连续形式对应F变换,离散形式就成了Z变换。离散信号呢? 离散周期函数的F级数,项数有限,离散非周期函数(看为周期延拓以后仍然是离散周期函数),离散F级数,仍然项数有限。离散的F变换,很容易理解---- 连续信号通过一个周期采样滤波器,也就是频率域和一堆脉冲相乘。时域取样对应频域周期延拓。为什么? 反过来容易理解了,时域的周期延拓对应频率域的一堆脉冲。
    两者的区别:FT=从负无穷到正无穷对积分 LT=从零到正无穷对积分 (由于实际应用,通常只做单边Laplace变换,即积分从零开始) 具体地,在Fourier积分变换中,所乘因子为exp(-jwt),此处,-jwt显然是为一纯虚数;而在laplace变换中,所乘因子为 exp(-st),其中s为一复数:s=D+jw,jw是为虚部,相当于Fourier变换中的jwt,而D则是实部,作为衰减因子,这样就能将许多无法 作Fourier变换的函数(比如exp(at),a>0)做域变换。
    而Z变换,简单地说,就是离散信号(也可以叫做序列)的Laplace变换,可由抽样信号的Laplace变换导出。ZT=从n为负无穷到正无穷对求和。 Z域的物理意义: 由于值被离散了,所以输入输出的过程和花费的物理时间已经没有了必然的关系(t只对连续信号有意义),所以频域的考察变得及其简单起来,我们把 (1,-1,1,-1,1,-1)这样的基本序列看成是数字频率最高的序列,他的数字频率是1Hz(数字角频率2Pi),其他的数字序列频率都是N分之 1Hz,频率分解的结果就是0-2Pi角频率当中的若干个值的集合,也是一堆离散的数。由于时频都是离散的,所以在做变换的时候,不需要写出冲击函数的因 子
    离散傅立叶变换到快速傅立叶变换----由于离散傅立叶变换的次数是O(N^2),于是我们考虑把离散序列分解成两两一组进行离散傅立叶变换,变换的计算复杂度就下降到了O(NlogN),再把计算的结果累加O(N),这就大大降低了计算复杂度。
    再说一个高级话题: 小波。在实际的工程应用中,前面所说的这些变换大部分都已经被小波变换代替了。
    什么是小波?先说什么是波:傅立叶级数里面的分量,sin/cos函数就是波,sin(t)/cos(t)经过幅度的放缩和频率的收紧,变成了一系列的波 的求和,一致收敛于原始函数。注意傅立叶级数求和的收敛性是对于整个数轴而言的,严格的。不过前面我们说了,实际应用FFT的时候,我们只需要关注部分信 号的傅立叶变换然后求出一个整体和就可以了,那么对于函数的部分分量,我们只需要保证这个用来充当砖块的"波函数",在某个区间(用窗函数来滤波)内符合 那几个可积分和收敛的定义就可以了,因此傅立叶变换的"波"因子,就可以不使用三角函数,而是使用一系列从某些基本函数构造出来的函数族,只要这个基本函 数符合那些收敛和正交的条件就可以了。怎么构造这样的基本函数呢?sin(t)被加了方形窗以后,映射到频域是一堆无穷的散列脉冲,所以不能再用三角函数 了。我们要得到频率域收敛性好的函数族,能覆盖频率域的低端部分。说的远一点,如果是取数字信号的小波变换,那么基础小波要保证数字角频率是最大的 2Pi。利用小波进行离频谱分析的方法,不是像傅立叶级数那样求出所有的频率分量,也不是向傅立叶变换那样看频谱特性,而是做某种滤波,看看在某种数字角 频率的波峰值大概是多少。可以根据实际需要得到如干个数字序列。
    我们采用(0,f),(f,2f),(2f,4f)这样的倍频关系来考察函数族的频率特性,那么对应的时间波形就是倍数扩展(且包含调制---所以才有频 谱搬移)的一系列函数族。频域是窗函数的基本函数,时域就是钟形函数。当然其他类型的小波,虽然频率域不是窗函数,但是仍然可用:因为小波积分求出来的变 换,是一个值,例如(0,f)里包含的总能量值,(f,2f)里面包含的总能量值。所以即使频域的分割不是用长方形而是其他的图形,对于结果来说影响不 大。同时,这个频率域的值,它的分辨率密度和时域
    小波基函数的时间分辨率是冲突的(时域紧频域宽,时域宽频域紧),所以设计的时候受到海森堡测不准原理的 制约。Jpeg2000压缩就是小波:因为时频都是局部的,变换结果是数值点而不是向量,所以,计算复杂度从FFT的O(NlgN)下降到了O(N),性 能非常好。

    展开全文
  • 基于MATLAB的语音信号处理

    万次阅读 多人点赞 2018-07-15 01:21:20
    基于MATLAB的语音信号处理摘要:语音信号处理是目前发展最为迅速的信息科学研究领域中的一个,是目前极为活跃和热门的研究领域,其研究成果具有重要的学术及应用价值。语音信号处理的研究,对于机器语言、语音识别、...

    基于MATLAB的语音信号处理


    摘要:语音信号处理是目前发展最为迅速的信息科学研究领域中的一个,是目前极为活跃和热门的研究领域,其研究成果具有重要的学术及应用价值。语音信号处理的研究,对于机器语言、语音识别、语音合成等领域都具有很大的意义。MATLAB软件以其强大的运算能力可以很好的完成对语音信号的处理。通过MATLAB可以对数字化的语音信号进行时频域分析,方便地展现语音信号的时域及频域曲线,并且根据语音的特性对语音进行分析。本文主要研究了基于MATLAB软件对语音信号进行的一系列特性分析及处理,帮助我们更好地发展语音编码、语音识别、语音合成等技术。本文通过应用MATLAB对语音信号进行处理仿真,包括短时能量分析、短时自相关分析等特性分析,以及语音合成等。

    关键词:语音信号;MATLAB;特性分析;语音合成

    引言

            人类交换信息最方便的、最快捷的一种方式是语言。在高度发达的信息社会中,用数字化的方法进行语音的识别、合成、增强、传送和储存等是整个数字化通信网中最重要、最基本的组成部分之一。数字电话通信、高音质的窄带语音通信系统、智能机器人、声控打字机、语言学习机、自动翻译机等,都要用到语音信号处理技术,随着现在集成电路和微电子技术的飞速发展,语音信号处理系统逐步走向实用化[1]

            语音信号处理是一个新兴的交叉学科,是语音和数字信号处理两个学科的结合产物。与认知科学、心理学、语言学、计算机科学、模式识别和人工智能学科有着密切的联系。语音信号处理技术的发展依赖于这些学科的发展,语音信号处理技术的进步也将促进这些领域的进展。语音信号处理目的是得到一些语音特征参数,以便高效的传输或存储,或通过某种处理以达到特定目的,如语音合成,辨识出讲话者、识别出讲话的内容等。随着现代科学技术和计算机技术的发展,除了人与人的自然语言的沟通,人机对话和智能机领域也开始使用语言。这些人造的语言拥有词汇,语法,语法结构和语义内容等。

            语音信号处理的研究可以追溯到1876年贝尔电话的发明,其在真正意义上首次用声电,电声转换技术实现了远距离语音传输。 1939Homer Dudley提出并研制成功第一个声码器,奠定了语音产生模型的基础,其在语音信号处理领域具有划时代的意义。在20世纪40年代,一种语言声学的专用仪器语谱图仪问世。它可以让你把语音的时变频谱用语图表示出来,得到一个“可见的语言 1984年哈斯金斯实验室研制成功语音回放机,此仪器可以自动转换手工绘制的语谱图成为语言,并进行语音合成。随着计算机的出现,语音分析技术可以在计算机上进行。此时语音信号处理无论是在基础研究或在技术应用,都已取得了突破性进展。现在语音信号可分为三个主要分支,即语音编码,语音识别和语音合成技术[10]

            语音编码技术。语音编码的目的就是在保证一定语音质量的前提下,尽可能降低编码比特率来节省频率资源。语音编码技术的研究开始于1939年, Homer Dudley提出并实现了在低带宽电话电报上传输语音信号的通道声码器,第一个研制成功了语音编码技术。到20世纪70年代,国际电联于1972年发布了64kbit/s脉冲编码调制(PCM)语音编码算法的G.711建议,它被广泛应用于数字交换机、数字通信等领域,从而占据统治地位。在199511ITU-T SG15全会上共轭代数码激励线性预测(CS-ACELP)的8kbit/s语音编码G.729建议被通过,并于19966ITU-T SG15会议上通过G.729附件A:减少复杂度的8kbit/s CS-ACELP语音编解码器,正式成为国际标准[1]

            语音识别技术。语音识别的研究开始于20世纪50年代贝尔实验室的Audry系统,它是第一个可以识别10个英文数字的语音识别系统, 1959FryDenes等人采用频谱分析和模式匹配来进行识别决策构建音素识别器来辨别9个辅音和4个元音。20世纪60年代末单语音识别的研究取得实质性进展,并将其作为一个重要的课题。一方面是因为计算机的计算能力有了迅速的提高,计算机能够提供实现复杂算法的硬件、软件;另一方面,数字信号处理在当时有了蓬勃发展,从而自20世纪60年代末开始引起了语音识别的研究热潮。

            语音合成技术。第一个合成器是在1835年由W.von Kempelen发明,经过Weston改进的机械讲话机。机器完全模仿人的生理过程,分别应用了特别设计的哨和软管模拟肺部空气动力和口腔。Homer Dudley1939年发明了第一台电子语音合成器,它不是一个简单的生理过程的模拟,而是在电子电路基础上来实现语音产生源。本文关于语音信号处理方面主要研究了语音合成。语音合成已经在许多方面得到了实际应用,方便了人们的生活,创造了很好的经济效益和社会效益,如公共交通中的自动报站、各种场合的自动报警、电话自动查询服务、文本校对中的语音提示等。综观语言合成技术的研究,语音合成发展方向为提高合成语音的自然度、丰富合成语音的表现力、降低语音合成技术的复杂度等。

    一、语音信号处理基本知识与仿真环境介绍

    1.1 语音信号处理基本知识

    1.1.1语音信号分析技术

            语音信号分析是语音信号处理的前提和基础,只有分析出可表示语音信号本质特征的参数,才有可能利用这些参数进行高效的语音通信、语音合成和语音识别等处理。而且,语音合成的音质好坏,语音识别率的高低,也都取决于对语音信号分析的准确性和精确性。因此语音信号分析在语音信号处理应用中具有举足轻重的地位。

            贯穿于语音分析全过程的是“短时分析技术”。语音信号从整体来看其本质特征的参数是随时间而变化的,所以它是一个非稳态过程,不能用处理稳信号的数字信号处理技术对其进行分析处理。但是,由于不同的语音是由人的口腔肌肉运动构成声道某种形状而产生的响应,而这种口腔肌肉运动相对于语音频率来说是非常缓慢的,所以从另一方面看,虽然语音倍号具有时变特性,但是在一个短时间范围内(一般认为在1030ms的短时间内),其特性基本保持不变即相对稳定,因可以将其看作是一个准稳态过程,即语音信号具有短时平稳性。所以任何语音信号的分析和处理必须建立在“短时”的基础上.即进行“短时分析”将语音信号分为一段一段来分析其特征参数,其中每一段称为一“帧”,帧长一般取为1030ms。这样,对于整体的语音信号来讲,分析出的是由每一帧特征参数组成的特征参数时间序列[4]

            根据所分析参数的性质的不同,可将语音信号分析分为时域分析、频域分析、倒领域分析等;时域分析方法具有简单、计算量小、物理意义明确等优点,但由于语音信号最重要的感知特性反映在功率谱中,而相位变化只起着很小的作用,所以相对于时域分析来说频域分析更为重要。

    1.1.2语音信号处理理论依据

        采样定理。在进行模拟/数字信号的转换过程中,当采样频率大于信号中最高频率的2倍时,采样之后的数字信号完整地保留了原始信号中的信息,一般实际应用中保证采样频率为信号最高频率的5~10倍。采样定理又称奈奎斯特定理。

            采样位数。采样位数即采样值或取样值,用来衡量声音波动变化的参数,是指声卡在采集和播放声音文件时所使用数字声音信号的二进制位数。

        采样频率。样频率是指计算机每秒钟采样多少个声音样本,是描述声音文件的音质、音调,衡量声卡、声音文件的质量标准。采样频率越高,即采样的间隔时间越短,则在单位时间内计算机得到的声音样本数据就越多,对声音波形的表示也越精确。采样频率与声音频率之间有一定的关系,根据奈奎斯特理论,只有采样频率高于声音信号最高频率的两倍时,才能把数字信号表示的声音还原成为原来的声音。这就是说采样频率是衡量声卡采集、记录和还原声音文件的质量标准。

            采样位数与采样频率的关系。采样位数和采样率对于音频接口来说是最为重要的两个指标,也是选择音频接口的两个重要标准。无论采样频率如何,理论上来说采样的位数决定了音频数据最大的力度,每增加一个采样位数相当于力度范围增加了6dB,采样位数越多则捕捉到的信号越精确,对于采样率来说你可以想象它类似于一个照相机,44.1khz意味着音频流进入计算机时计算机每秒会对其拍照达441000次。显然采样率越高,计算机提取的图片越多,对于原始音频的还原也越加精确。

    1.2 实现平台MATLAB 7.0介绍

    1.2.1 MatLab软件基本介绍

            MATLAB产生于1982年,是一种效率高、功能强的数值计算和可视化计算机高级语言,它将信号处理、数值分析和图形显示结合一体,形成了一个极其方便又强大的操作环境,为科学研究、工程设计以及必须进行有效数值计算的众多科学领域提供了一种全面的解决方案,并在很大程度上摆脱了传统非交互式程序设计语言的编辑模式,代表了当今国际科学计算软件的先进水平[7]

            MATLAB7.0是美国MathWorks公司出品的商业数学软件,用于算法开发、数据可视化、数据分析以及数值计算的高级技术计算语言和交互式环境。MATLAB 7.0 的应用范围非常广,包括信号和图像处理、通讯、控制系统设计、测试和测量、财务建模和分析以及计算生物学等众多应用领域

    1.2.2 MatLab与语音处理的关系

            MATLAB软件以其强大的运算能力可以很好的完成对语音信号的处理。通过MATLAB可以对数字化的语音信号进行时频域分析,方便地展现语音信号的时域及频域曲线,并且根据语音的特性对语音进行分析。例如,请浊音的幅度差别、语音信号的端点、信号在频域中的共振峰频率、加不同窗和不同窗长对信号的影响、LPC分析、频谱分析等[3]

            同时,通过MATLAB可以对数字化的语音信号进行估计和判别。例如,根据语音信号的短时参数,一级不同语音信号的短时参数的性质对一段给定的信号进行有无声和请浊音的判断、对语音信号的基音周期进行估计等。另外,通过利用MATLAB编程可以对语音信号进行各种处理。由于MATLAB是一种面向科学和工程计算的高级语言,允许用数学形式的语言编程,又有大量的库函数,所以编程简单、编程效率高、易学易懂,我们可以对信号进行加噪去噪、滤波、截取语音等,也可进行语音编码、语音识别、语音合成的处理等。总之,对于语音信号进行分析处理,MATLAB软件是当今比较高效的平台。

    二、语音信号的特点与采集

    2.1语音信号的特点分析

            语音信号的特点可以分为时域方面和频域方面。

            在时域内,语音信号具有短时性的特点,即在总体上,语音信号的特征是随着时间而变化的,但在一段较短的时间间隔内,语音信号保持平稳。

            在频域内,语音信号的频谱分量主要集中在300~3400Hz的范围内。利用这个特点,可以按8kHz的采样率对语音信号进行采样,得到离散的语音信号。语音信号的这两种特点均可通过MATLAB软件表现出来,如图2.1和图2.2所示。


    图2.1 语音信号时域图


    图2.2 语音信号频域分析

    2.2语音信号的采集

    2.2.1语音信号的量化编码采样

            在将语音信号进行数字化前,必须先进行防混叠预滤波,预滤波的目的有两个,一是抑制输入信导各领域分量中频率超出/2的所有分量(为采样频率),以防止混叠干扰;二是抑制50Hz的电源工频干扰。这样,预滤波器必须是一个带通滤波器,设其上、下截止颜率分别是和,则对于绝人多数语音编译码器,=3400Hz、=60~100Hz、采样率为=8kHz;而对于语音识别而言,当用于电话用户时,指标与语音编译码器相同。当使用要求较高或很高的场合时=4500Hz或8000Hz、=60Hz、=10kHz或20kHz。

            为了将原始模拟语音信号变为数字信号,必须经过采样和量化两个步骤,从而得到时间和幅度上均为离散的数字语音信号。采样也称抽样,是信号在时间上的离散化,即按照一定时间间隔△t在模拟信号x(t)上逐点采取其瞬时值。采样时必须要注意满足奈奎斯特定理,即采样频率必须以高于受测信号的最高频率两倍以上的速度进行取样,才能正确地重建波它是通过采样脉冲和模拟信号相乘来实现的。

            在采样的过程中应注意采样间隔的选择和信号混淆:对模拟信号采样首先要确定采样间隔。如何合理选择△t涉及到许多需要考虑的技术因素。一般而言,采样频率越高,采样点数就越密,所得离散信号就越逼近于原信号。但过高的采样频率并不可取,对固定长度(T)的信号,采集到过大的数据量(N=T/△t),给计算机增加不必要的计算工作量和存储空间;若数据量(N)限定,则采样时间过短,会导致一些数据信息被排斥在外。采样频率过低,采样点间隔过远,则离散信号不足以反映原有信号波形特征,无法使信号复原,造成信号混淆。根据采样定理,当采样频率大于信号的两倍带宽时,采样过程不会丢失信息,利用理想滤波器可从采样信号中不失真地重构原始信号波形。量化是对幅值进行离散化,即将振动幅值用二进制量化电平来表示。量化电平按级数变化,实际的振动值是连续的物理量。具体振值用舍入法归到靠近的量化电平上。

            语音信号经过预滤波和采样后,由A/D变换器变换为二进制数字码。这种防混叠滤波通常与模数转换器做在一个集成块内,因此目前来说,语音信号的数字化的质量还是有保证的。市面上购买到的普通声卡在这方面做的都很好,语音声波通过话筒输入到声卡后直接获得的是经过防混叠滤波、A/D变换、量化处理的离散的数字信号。

    2.2.2利用Windows录音器采集语音信号

    在本次设计中,可以利用Windows自带的录音机录制语音文件,图2.3是基于PC机的语音信号采集过程,声卡可以完成语音波形的A/D转换,获得WAV文件,为后续的处理储备原材料。调节录音机保存界面的更改选项,可以存储各种格式的WAV文件。

      

    2.3 基于PC机的语音采集过程

    第三章 语音信号的分析

    3.1 语音信号的短时能量分析
            一定时宽的语音信号,其能量的大小随时间有明显的变化。清音信号和浊音信号之间的能量差别相当显著。其中清音段(以清音为主要成份的语音段),其能量比浊音段小得多[10]。因此,对语音的短时能量进行分析,可以描述语音的这种特征变化情况。定义短时能量为如式(3-1)所示。
                                                     (3-1)
    其中N为窗长。特殊地,当采用矩形窗时,可简化为如式(3-2)所示。
                                                            (3-2)
    也可以从另外一个角度来解释。令
                                                              (3-3)                                         
    则 可表示为如式(3-4)所示。
                                              (3-4)  
            可以理解为,首先语音信号各个样点值平方,然后通过一个冲击响应为h(n)的滤波器,输出为由短时能量构成的时间序列。
            短时能量的计算直接受冲击响应的选择即窗函数的选择的影响。如果冲击响应的幅度是恒定的,它的序列长度N(即窗长)会很长,将其等效为非常窄的低通滤波器,这时冲击响应对 产生的平滑的作用比较明显,使短时能量基本没有很大的变化,将不能表现出语音的时变的特性。相反,如果冲击响应的序列长度过于小,等效窗就不能提供出够用的平滑,以导致语音的振幅在瞬时的变化的许多细节仍被留了下来,进而不能看出振幅包络变化的规律,一般我们要求窗长是几个基音周期的数量级。
            图3.1为采样率8000kHZ,16位,单声道的一个语音信号(单词“earth”)在不同矩形窗长时的短时能量函数,我们会发现:语音信号的幅度变化在被短时能量所反映时,窗长的长短都有影响。
     
    图3.1 不同矩形窗长的短时能量函数
            我们知道,单词earth前半部分是浊音,后半部分是清音。由以上分析结果可知,浊音部分的能量较之清音部分要大得多,而清音部分的能量相当小,几乎为零。
            对语音信号进行短时能量函数运算,可实现以下三点应用:
    (1)可用于区分清音段与浊音段。En值大对应于浊音段,En值小对应于清音段。
    (2)可用于区分浊音变为清音或清音变为浊音的时间(根据En值的变化趋势)。
    (3)对高信噪比的语音信号,也可以用来区分有无语音(语音信号的开始点或终
    止点)。无信号(或仅有噪声能量)时,En值很小,有语音信号时,能量显著增大。
    3.2短时自相关分析
            对于确定性信号序列,自相关函数定义如式(3-5)所示。
                                                      (3-5)
            对于随机性信号序列或周期性信号序列,自相关函数的定义如式(3-6)所示。
                                                (3-6)
            自相关函数具有以下几项性质:
        (1)若序列是周期性的,假设序列周期为 ,那么其自相关函数也是具有相同周期的周期函数,即 
        (2)自相关函数是偶函数,即R(k)=R(-k);
        (3)当k=0时,自相关函数有极大值,即
        (4)R(0)为随机性序列的平均功率或确定性信号序列的能量。
            自相关函数的上述性质,完全可以适用于语音信号的时域分析中。例如,浊音语音波形序列具有周期性,因此可用自相关函数求出这个周期,即是基音周期。此外,自相关函数也可用在语音信号的线性预测分析中。
    短时自相关函数的定义如式(3-7)所示。 
                                        (3-7)
    令 ,并且 ,可以得到如下式子,如(3-8)所示。
                                  (3-8)
            如图3.2是在不同的矩形窗窗长条件下单词earth的语音自相关的函数的波形。
            对两图分析可得:清音信号的短时自相关函数的波形不具有周期性,也没有明显的峰值,且随着延时k的增大迅速变小,因此其接近于随机噪声;浊音是具有周期性的信号,浊音信号的周期为自相关函数的周期,由此可知,语音信号的性质是浊音还是清音,如果是浊音,还可以得出它的基音周期,它的基音周期可由自相关函数波形中的第一个峰值的位置来估计。所以,自相关函数常用作一下两种作用:
    (1) 区分语音信号是清音还是浊音;
    (2) 估计浊音语音信号的基音周期[4]。
     

    图3.2 不同的矩形窗窗长下短时自相关

    第四章 语音合成

    4.1 语音合成技术概述
    4.1.1 语音合成技术的意义                                                   
            语音合成技术涉及声学、语言学、数字信号处理技术、多媒体技术等多个领域, 是当今世界强国竞相研究的热门技术之一。语音合成技术可分为参数合成和波形拼接两种方法。早期的研究主要是采用参数合成方法, 它是计算发音器官的参数, 从而对人的发音进行直接模拟。语音合成已经在许多方面得到了实际应用,方便了人们的生活,创造了很好的经济效益和社会效益,如公共交通中的自动报站、各种场合的自动报警、电话自动查询服务、文本校对中的语音提示等[8]。
            本文主要利用载波调制技术进行语音合成。基于载波调制的语音信号合成是以语音信号处理技术、数字信号处理技术为基础,依托于电子计算机、Windows操作系统、MATLAB处理软件等工具将两个信号合成为一个信号。具有较强的实用性、可操作性等特点。
    4.1.2 基于载波调制语音合成的基本原理
                语音信号合成是一个“分析—存储—合成”的过程。一般是选择合适的基本单元,将基本单元用一定的参数编码方式或波形方式进行存储,形成一个语音库。合成时,根据待合成语音信号,从语音库中取出基本单元进行合成,并将其还原成语音信号。在语音合成中,为了便于存储和后续分析,必须先将语音信号进行预分析、预处理、波形变换等一系列操作。其中,基元是语音合成处理的最小单元,待合成的语音库就是所有语音基元的某中集合。根据基元的选择方式以及其存储形式的不同,可以将合成方法笼统的分为波形合成方法和参数合成方法。
            波形合成是一种相对简单的语音合成技术。它把人的发音波形直接存储或者进行进行简单的波形编码后存储,组成一个合成的语音库;合成时,根据待合成的信息,在语音库中取出相应单元的波形数据,拼接或编辑到一起,经过解码还原成语音。该语音合成技术具有一定的局限和不足,但对语音信号具有数据量庞大的特点,这种误差在某种范围内是可以接受的。
            基于载波调制的语音信号合成是基于信号的振幅调制原理而实现的。将低频信号加载到高频载波信号的过程,或者说把信息加载到信息载体上以便传输的处理过程,称为调制。所谓“加载”,其实质是使高频载波信号(信息载体)的某个特性参数随信息信号幅值的大小程线性变化。基于载波调制的语音信号合成是以语音一信号作为调制信号,语音二信号为载波信号来进行合成一种以语音二信号声色表述语音一内容的新信号。这种调制方式是用传递的低频信号(如代表语言、音乐、图像的电信号)去控制作为传送载体的高频振荡波(称为载波)的幅度,是已调波的幅度随调制信号的大小线性变化,而保持载波的角频率不变。
    4.2 基于载波调制的语音合成基本知识
    4.2.1 关键函数希尔伯特变换介绍
            本文语音合成的设计思路是用一个语音信号的包络去调制另一个语音信号,实现语音的合成。这就用到了一个关键的函数,希尔伯特变换。在数学与信号处理的领域中,一个实值函数的希尔伯特变换是将信号s(t)与1/(πt)做卷积,以得到s'(t)。因此,希尔伯特变换结果s'(t)可以被解读为输入是s(t)的线性时不变系统的输出,而此系统的脉冲响应为1/(πt)。这是一项有用的数学工具,用在描述一个以实数值载波做调制的信号之复数包络,出现在通讯理论中发挥着重要作用[9]。
            希尔伯特变换的频域数学表达式如式(4-1)所示。                       
                                                          (4-1)
    其中F是傅里叶变换,i是虚数单位,ω是角频率。
            希尔伯特变换等效于 π/2的相移,对正频率产生-π/2的相移,对负频率产生π/2相移,或者说,在时域信号每一频率成分移位1/4波长,因此,希尔伯特变换又称为90度移相器。
            MATLAB提供了计算Hilbert变换的函数,其格式为y=Hilbert(x)。但需注意的是,该函数计算出的结果是序列的解析信号,其虚部才是序列的Hilbert变换。
            希尔伯特变换在语音信号处理中具有两个性质: 序列x(n)通过Hilbert变换器后,信号频谱的幅度不发生变化,这是因为Hilbert变换器是全通滤波器,引起频谱变化的只是其相位; 序列x(n)与其Hilbert变换是正交的[6]。
    4.2.2 信号调制
            所谓调制,就是将调制信号加载在三个参数中的某一个参数上,或幅值、或频率、或相位,随调制信号大小成线性或非线性变化的过程。主要有三种基本调制方法,第一种是把调制信号加载在载波信号的幅值上,称为幅度调制 ,简称AM;第二种是把调制信号加载在载波的频率上,称为频率调制,简称FM。 第三种是把调制信号装载在载波的相位上,称为相位调制,简称PM[10]。 本设计采用的是第一种方法,用采集到的语音二信号去对语音一信号进行幅度调制,实现语音合成的目的。
            采用调幅调制是因为其以下特点在语音信号处理中得到很好的应用。一是调幅波的振幅(包络)随调制信号变化,而且包络的变化规律与调制信号波形一致,表明调制信号(信息)记载在调幅波的包络中;二是调制系数反应了调幅的强弱程度,一般情况下,调制系数越大调幅度越深。
            当调制系数为0时,表示未调幅,即无调幅作用;
            当调制系数为1时,此时包络的振幅最小值为0;
            当调制系数大于1时,已调波的包络与调制信号不一样,产生严重的包络失真,称为过量调幅。
    4.3 语音信号合成过程
    4.3.1 语音信号合成流程图
            用MATLAB 处理音频信号的基本流程是:先将WAV 格式音频信号经wavread 函数转换MATLAB 列数组变量;再用MATLAB 强大的运算能力进行数据分析和处理,如时域分析、频域分析、数字滤波、信号合成、信号变换、识别和增强等等;处理后的数据如是音频数据,则可用wavwrite函数 转换成WAV 格式文件或用sound、wavplay 等函数直接回放。本设计的语音合成流程图如图4.1所示。
     
    图4.1  语音信号合成流程图
    4.3.2 语音信号的采集
            分析和处理音频信号,首先要对声音信号进行采集,MATLAB 的数据采集工具箱提供了一整套命令和函数,通过调用这些函数和命令,可直接控制声卡进行数据采集。Windows 自带的录音机程序也可驱动声卡来采集语音信号,并能保存为WAV 格式文件,供MATLAB 相关函数直接读取、写入或播放。本文以WAV 格式音频信号作为分析处理的输入数据。
    4.3.3 语音信号的合成
            声音信号是一种非平稳信号,如果采用简单的时变系统的分析方法,将会产生很大的失真,但是在一小段时间内声音信号完全可以视为平稳信号。因此必须对语音信号做预处理。在本次语音信号合成中采用加窗截断,分帧处理将非平稳信号近似转换为平稳信号。
            声音信号特征量提取。声音信号特征量提取包括语音一声音信号声色(频率)的提取和语音二声音信号包络的提取。语音二声音信号包络的提取采用希尔伯特变换实现,得到语音二声音信号的复数包络。
            获取语音信号起始位置。在录音过程中控制两段声音从相同的起点开始录取并不是一件容易的事,但是如果不确定语音信号的起始位置直接对语音信号进行合成既存在数据量大又会带来较大的误差。本设计语音合成中拟定连续四个时间点的语音信号强度不为0,则认为语音信号开始,也即找到信号起始位置。
            语音信号合成。语音信号合成即是一个调幅载波的过程,是以语音一信号作为载波信号,语音二信号包络作为调幅信号来实现语音合成。实际的载波是一个物理可实现的复杂过程,本语音合成中采用语音一信号点乘包络信号,实际的载波是一个物理可实现的复杂过程,并非简单地乘积运算,然而,得到的合成声音信号效果并不理想,但其波形仍能反应载波过程的实质。
    4.4 语音信号合成结果及分析
    4.4.1 语音信号预处理结果及分析
            该处理过程以语音一信号和语音二声音信号为分析样本。使用Windows系统自带录音器分别录下语音一和语音二,分别命名为one和two,保存为WAV格式。通过MATLAB对所录语音进行采样,采样频率 为16000Hz,获取语音信号并进行加窗。语音一和语音二的时域波形图如图4.2所示,时域图反映出了语音信号的非平稳性。
            对采集到的语音信号分别做傅里叶变换进行频谱分析,并显示频谱图,观察各自的幅频谱特性。语音一和语音二的声音信号幅频特性如图4.3所示,语音一和语音二的声音FFT图如图4.2和图4.3。该频谱图横坐标并未进行对应关系处理,但仍不失其频谱特性的本质,由频谱图可清楚地看到样本声音主要以低频为主。人的语音信号频率一般集中在1kHz之前,从声音频谱的包络来看, 根据采样定理,信号宽度近似取为1kHz,重放语音后仍可较清晰的听出原声, 不存在声音混叠现象。
     
    图4.2  信号预处理之后时域图
     
    图4.3 信号预处理之后频域图
    4.4.2 合成语音信号结果及分析
            合成语音信号的实质是用语音二信号的包络调制语音一信号振幅的结果。语音二信号包络提取结果如图4.4,该图是语音二信号经希尔伯特—黄变换的虚部显示,因为希尔伯特—黄变换是一个时域信号与1/(πt)的卷积,其结果是载波做调制信号之复数包络,必然蕴含虚部成分,取其虚部的结果必然与时域信号有着直观上的差别,但仍是信号的包络成分。
     
    图4.4 语音二信号包络图
            合成信号的时域显示结果如图4.5所示,该合成信号是以语音一信号的特性和语音二信号的幅度变化的,由其快速傅里叶变换的结果更证实了这一点,其幅频特性与语音一信号的幅频特性更接近。
     
    图4.5 合成语音信号的时域波形
     
    图4.6 合成语音信号的幅频特性

     

    图4.7 合成语音信号快速傅里叶变换结果


    结  论

            随着语音技术的逐渐成熟,语音信号处理技术也在不断发展,不断完善。本文主要研究了通过对语音信号短时能量、短时自相关等特性参数的分析,使我进一步了解了语音信号的特性,明白了只有准确分析并提取出语音信号的特征参数,才能够利用这些参数进行语音编码、语音合成等处理。另外在语音处理方面,我选择了语音合成这一处理方式。基于载波调制的语音处理实现简单,运用广泛,研究这一语音合成方法及特性,对于更加深入地进行各种语音处理有着重要的意义。这次设计我是通过了MATLAB这一平台,MATLAB软件以其强大的运算能力可以很好的完成对语音信号的处理,因此,近一步的加强对MATLAB的研究对我以后的学习会起到很大的帮助。
            至此,设计基本符合要求。但是由于个人能力的有限,采集的语音信号清、浊音区分不明显,导致对语音进行短时自相关得出的波形特征不明显。考虑解决方案是通过专业的设备采集语音信号。除此之外,本设计必有其他欠妥之处,请各位老师给予指正!

    参考文献

    [1] 张雪英.数字语音处理[M].北京:电子工业出版社, 2010.
    [2] 郑君里,应启绗,杨为理.信号与系统[M].北京:高等教育出版社,2000.
    [3] 薛年喜.MATLAB在数字信号处理中的应用[M].北京:清华大学出版社,2003.
    [4] 胡航.语音信号处理[M].哈尔滨:哈尔滨工业大学出版社, 2000.
    [5] 易克初,田斌,付强.语音信号处理[M].北京:国防工业出版社, 2000.
    [6] 万永革.数字信号处理的MATLAB实现[M].北京:科学出版社,2007.
    [7] 刘卫国. MATLAB程序设计与应用[M].北京:高等教育出版社,2006.
    [8]王嘉梅.基于MATLAB的数字信号处理与时间开发[J].西安:西安电子科技大学出版社,2007:10-14.
    [9] 程佩青.数字信号处理教程(第二版)[M].北京:清华大学出版社,2010.
    [10] 韩纪庆 张磊 郑铁然.语音信号处理[M].北京:清华大学出版社,2004.
    [11] 徐明远,邵玉斌. Matlab仿真在通信与电子工程中的应用[M].西安:西安电子科技大学出版社,2005. 
    [12] 邓华. Matlab通信仿真及应用实例详解[M].北京:人民邮电出版社,2005. 
    [13] 张照明,刘政波,刘斌等. 应用Matlab实现信号分析处理[C].北京:科学出版社,2006.
    [14] 徐守时. 信号与系统理论方法和应用[M].合肥:中国科学技术大学出版,1999. 

    [15] 高俊斌. Matlab语言与程序设计[M].武汉:华中理工大学出版社,1998. 

    附  录

    附录A   语音信号特性分析程序

    %语音信号时域频域显示%
    [y,Fs,bits]=wavread('biye.wav');%读出信号、采样率和采样位数
    y=y(:,1);%取单声道
    sigLength=length(y);
    Y=fft(y,sigLength); 
    Pyy=Y.* conj(Y) / sigLength;
    halflength=floor(sigLength/2);
    f=Fs*(0:halflength)/sigLength;
    figure;plot(f,Pyy(1:halflength+1));
    xlabel('Frequency(Hz)');
    t=(0:sigLength-1)/Fs;
    figure;
    plot(t,y);
    xlabel('Time(s)');
    
    %语音信号短时能量%
    x=wavread('biye.wav');
    %x=fscanf(fid,'% f');
    %fclose(fid);
    s=fra(50,25,x)
    s2=s.^2;
    energy=sum(s2,2)
    subplot(2,2,1)
    plot(energy);
    xlabel('帧数')
    ylabel('短时能量 E')
    legend('N=50')
    %axis({0,1500,0,10*10^5})
    s=fra(100,50,x)
    s2=s.^2;
    energy=sum(s2,2)
    subplot(2,2,2)
    plot(energy);
    xlabel('帧数')
    ylabel('短时能量 E')
    legend('N=100')
    %axis({0,750,0,2*10^6}) 
    s=fra(400,200,x)
    s2=s.^2;
    energy=sum(s2,2)
    subplot(2,2,3)
    plot(energy);
    xlabel('帧数')
    ylabel('短时能量 E')
    legend('N=400')
    %axis({0,190,0,7*10^6})
    s=fra(800,400,x)
    s2=s.^2;
    energy=sum(s2,2)
    subplot(2,2,4)
    plot(energy);
    xlabel('帧数')
    ylabel('短时能量 E')
    legend('N=800') 
    %axis({0,95,0,14*10^6})
    
    %语音信号短时自相关%
    x=wavread('biye.wav');
    s1=x(1:320);
    N=320;   %选择的窗长,加N=320的矩形窗
    A=[];
    for k=1:320;
    sum=0;
    for m=1:N-(k-1);
    sum=sum+s1(m)*s1(m+k-1);   %计算自相关
    end
    A(k)=sum;
      end
    for k=1:320
    A1(k)=A(k)/A(1);        %归一化A(k)
       end
    N=160;                  %选择的窗长,%加N=160的矩形窗
    B=[];
    for k=1:320;
    sum=0;
    for m=1:N-(k-1);
    sum=sum+s1(m+k-1);   %计算自相关
    end
    B(k)=sum;
    end
    for k=1:320
    B1(k)=B(k)/B(1);      %归一化B(k)
    end
    N=70;                 %选择的窗长,加N=70的矩形窗
    C=[];
    for k=1:320;
    sum=0;
    for m=1:N-(k-1);
    sum=sum+s1(m)*s1(m+k-1);        %计算自相关
    end
    C(k)=sum;
    end
    for k=1:320
    C1(k)=C(k)/C(1);                %归一化C(k)
    end
    s2=s1/max(s1)
    figure(1)
    subplot(4,1,1)
    plot(s2)
    title('语音信号')
    xlabel('样点数')
    ylabel('幅值')
    axis([0,320,-2,2])
    subplot(4,1,2)
    plot(A1)
    xlabel('延时k')
    ylabel('R(k)')
    axis([1,320,-2,2]);
    legend('N=320')
    subplot(4,1,3)
    plot(B1);
    xlabel('延时k')
    ylabel('R(k)')
    axis([1,320,-2,2]);
    legend('N=160')
    subplot(4,1,4)
    plot(C1);
    xlabel('延时k')
    ylabel('R(k)')
    axis([0,320,-2,2]);
    legend('N=70')
    附录B  语音合成主程序
    [y1,fs,bits]=wavread('one');      %读取语音一信号
    [y2,fs,bits]=wavread('two');      %读取语音二信号
    L1=length(y1);                    %测定语音一信号长度
    L2=length(y2);                    %测定语音二信号长度
    a1=y1.*hamming(L1);               %加窗预处理
    a2=y2.*hamming(L2);               %加窗预处理
    L1=length(a1);                    %测定语音一信号长度
    L2=length(a2);                    %测定语音二信号长度
    %采样信号的时域显示
    figure(1);
    subplot(211);
    plot(a1);
    title('语音一载波信号时域波形');
    subplot(212);
    plot(a2);
    title('语音二调幅信号时域波形');
    %傅里叶频谱绘制
    F1=fft(a1,L1);                    
    F2=fft(a2,L2);
    AF1=abs(F1);
    AF2=abs(F2);
    figure(2);
    subplot(211);
    plot(AF1);
    title('语音一载波信号幅频特性显示');
    subplot(212);
    plot(AF2);
    title('语音二调幅信号幅频特性显示');
    figure(3);
    freqz(F1);
    title('语音一载波信号FFT频谱显示');
    figure(4);
    freqz(F2);
    title('语音二载波信号FFT频谱显示');
    %获取语音一信号的开始位置
    for i=1:L1-4
         g(i)=a1(i).*a1(i+1).*a1(i+2).*a1(i+3).*a1(i+4);%认为连续4个幅值不为0的信号即为开始
         if g(i)~=0
             break;
         else i=i+1;
         end
    end
    I=i;
     
    % 获取语音二信号开始位置
    for j=1:L2-4
         m(j)=a2(j).*a2(j+1).*a2(j+2).*a2(j+3).*a2(j+4);
         if m(j)~=0
             break;
         else j=j+1;
         end
    end
    J=j;
    %语音二信号hilbert变换
    H=hilbert(a2);
    figure(5);
    plot(abs(H));
    title('语音二信号包络显示');
    %信号对齐,语音二包络调制语音一振幅
    max1=max(I,J);
    for k=1:L1-max1
        N(k)=a1(i).*H(j);
        i=i+1;
        j=j+1;
    end
    %N=N';
    N = N/(max(abs(N)) * 1.05);
    wavwrite(N,16000,16,'HC.wav');
    figure(6);
    plot(imag(N));
    title('合成信号时域显示');
    pause(1);
    sound(10*N,fs);
    FN=fft(N);
    figure(7);
    freqz(FN);
    title('合成声音信号FFT显示');
    figure(8);
    plot(abs(FN));
    title('合成声音信号的幅频特性');
    

    展开全文
  • 机器学习中平衡数据的处理方式

    万次阅读 2018-08-24 10:44:56
    平衡数据的场景出现在互联网应用的方方面面,如搜索引擎的点击预测(点击的网页往往占据很小的比例),电子商务领域的商品推荐(推荐的商品被购买...顾名思义即我们的数据集样本类别极均衡,以二分类问题为例,...
  • Java两种处理异常方法的区别

    万次阅读 多人点赞 2017-11-26 18:02:32
    在介绍异常处理之前我们先了解一下异常 我的博客什么是异常简单来说,java程序在运行期间发生的问题就是异常。在Java中,把异常信息封装成了一个类,当出现了问题时,就会创建异常类对象并抛出异常相关信息(如异常...
  • 图像处理与识别

    千次阅读 多人点赞 2017-03-23 09:45:48
    数字图像处理是对图像进行分析、加工、和处理... 数字图像处理是信号处理的子类, 另外计算机科学、人工智能等领域也有密切的关系。 传统的一维信号处理的方法和概念很多仍然可以直接应用在图像处理上,比如降噪、
  • [深度学习技巧]·数据类别平衡问题处理

    千次阅读 多人点赞 2019-03-11 14:03:39
    数据类别平衡问题处理 转载地址 1.什么是类别平衡问题 如果不同类别的训练样例数目稍有差别,通常影响不大,但若差别很大,则会对学习过程造成困扰。例如有998个反例,但是正例只有2个,那么学习方法只需要...
  • 数据样本平衡问题处理方法

    万次阅读 2017-12-05 15:49:31
    很多分类学习方法针对都有一个共同的基本假设,即不同...这就使得对于处理不平衡数据有着及其重要的意义。 1.使用正确的评估指标 例如对于有998个的反例,但正例只有2个,那么学习方法只要返回一个永远把样本预测为
  • 数字图像处理知识点

    千次阅读 多人点赞 2020-02-03 16:11:34
    数字图像处理知识点 目录 数字图像处理知识点 第一章 概述 1.1数字图像处理相关概念 1.2数字图像处理系统流程图: 1.3 数字图像处理主要研究内容 第二章 数字图像处理基础 2.1图像的数字化及表达 2.2图像...
  • 文章目录 神经网络知识大串联 1:第一代的神经元模型 3 2:从M-P模型到感知器模型 3 3:前馈神经网络 3 4:后向传播BP算法神经网络 4 ...自然语言处理知识大串联 1:one-hot 11 2:Word-embeding 词嵌入 11 3:Word2V...
  • 傅里叶的基本定义性质在这里就不作赘述了,文章主要想说明它的主要应用,以助于大家对这个概念有一个更为形象的认识。 傅里叶变换是一种分析信号的方法,它可分析信号的成分,也可用这些成分合成信号。在分析信号...
  • 自然语言处理(NLP)简介

    万次阅读 多人点赞 2020-05-30 00:00:29
    简单地说,自然语言处理就是用计算机来处理、理解以及运用人类语言(如中文、英文等),它属于人工智能的一个分支,是计算机科学语言学的交叉学科,又常被称为计算语言学。由于自然语言是人类区别于其他动物的根本...
  • 三者之间既有区别,又有联系,确切的描述:计算机图形学≈画图计算机视觉≈看图数字图像处理≈看图前沐浴更衣焚香做好各种仪式,然后再看图计算机图形学(Computer Graphics)讲的是图形,也就是图形的构造方式,...
  • 数字信号处理(一)利用FFT对信号进行频谱分析

    万次阅读 多人点赞 2019-11-17 15:42:39
    问题二:(2) 对一个周期序列分别取一个周期或多个周期所的频谱分析结果是否有区别? 有区别,因为对于一个周期和多个周期的频谱分析,其取样时矩形函数的宽度不同,则频域所对应的包络的宽度也不同。当所取的周期...
  • 数字图像处理复习总结

    万次阅读 多人点赞 2019-01-03 22:19:26
    复习着感觉记不住,于是乎,有了这篇博文,如果也同样选修了数字图像处理课程的小伙伴们可以参考一哈! 纯手码字…逢考必过! 概念 采样量化 灰度变换缓慢的景物:粗采样、细量化 有大量细节变化的图像:...
  • 大数据的流处理和批处理及其框架

    万次阅读 2019-07-09 19:15:25
    原文链接 ...在之前的文章中,我们曾经介绍过有关大数据系统的常规概念、处理过程,以及各种专门术语,本文将介绍大数据系统一个最基本的组件:处理框架。处理框架负责对系统中的数据进行计算,...
  • 课程特色: 1、以实际PS图像编辑合成的流程为导向,绝大多数内容都是为了完成某个具体任务,而不是为了讲解某个软件操作而凑数。 2、不同于国内多数教程和书籍,每个知识点务求讲精、讲透,帮助你掌握PS的精髓,...
  • Java异常机制及异常处理建议

    千次阅读 2017-08-26 12:12:51
    1、 Java异常机制 异常指不期而至的各种状况,如:文件找到、网络连接失败、非法参数等。异常是一个事件,它发生在程序运行期间,干扰了正常的指令流程。Java通过API中Throwable类的众多子类描述各种不同的异常。...
  • 数字信号处理——绪论总结

    千次阅读 多人点赞 2020-09-13 16:50:59
    数字信号处理绪论总结,包括介绍背景;信号处理、数字信号处理;数字信号处理学科概览;数字信号处理的特点;数字信号处理的局限性;数字信号处理的应用。
  • Python数据分析基础: 数据缺失值处理

    千次阅读 2020-10-31 21:56:01
    本篇开始分享如何使用Python进行数据分析,主要侧重介绍一些分析的方法和技巧,而对于pandas和numpy等Pyhon计算包的使用会在问题中提及,但详细介绍。本篇我们来说说面对数据的缺失值,我们该如何处理。文末有.
  • 图像处理与识别学习小结

    千次阅读 2019-01-08 16:41:19
    数字图像处理是对图像进行分析、加工、和处理,使其满足视觉、... 数字图像处理是信号处理的子类, 另外计算机科学、人工智能等领域也有密切的关系。 传统的一维信号处理的方法和概念很多仍然可以直接应用在图像处...
  • 本文介绍一种在灰度图像复原成彩色RGB图像方面的代表性工作:**《全局和局部图像的联合...另外基于图像处理的方法,如图像增强和图像复原,以及曾经很火的超分辨率算法。都是在增加额外信息的前提下的实现方式。
  • 关于 LiDAR 点云数据处理的一些思考

    万次阅读 多人点赞 2019-04-20 23:00:59
    机器学习中分类回归问题的区别与联系 三维重建10:点云配准和点云匹配 激光雷达点云数据处理相关算法库收集 这个重要: 处理点云数据(二):点云生成前视图 联系作者 邮箱:Neverland_LY@163.com...
  • 医学图像处理中图像分割是最具挑战性和最富有挑战性的课题,结构分析,运动分析,三维可视化等一系列操作均是以准确的图像分割为基础。由于医学影像设备成像技术的特点,使得图像存在噪声,导致图像中目标物体部分...
  • 信息处理技术员下午考试试题分析

    千次阅读 2018-09-21 17:45:11
    信息处理技术员包含基础知识和应用技术两个考试科目,基础知识安排在第一天上午9:00-11:30,应用技术由于是上机考试进行了分批,A卷B卷安排在第一天的下午,C卷则安排在第二天上午。请考生们合理安排自己的时间...
  • 医学图像处理综述

    万次阅读 多人点赞 2019-07-09 22:15:51
    0、引言 医学图像处理的对象是各种不同成像机理的医学影像,临床广泛使用的医学成像种类...利用计算机图象处理技术对二维切片图象进行分析和处理,实现对人体器官、软组织和病变体的分割提取、三维重建和三维显示...
  • 中点海康集团数据存储与处理事业部校招面试

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 394,252
精华内容 157,700
关键字:

不作处理与不做处理的区别