窗函数——语音处理必备

一.什么是频谱泄露?

  一句话,频谱泄露就是分析结果中,出现了本来没有的频率分量。比如说,50Hz的纯正弦波,本来只有一种频率分量,分析结果却包含了与50Hz频率相近的其它频率分量。
  更简单的描述是:分析结果与实际不一致!

也就是说我们分析的频率与实际采集的频率如果匹配了,用一个点就可以表示,但是实际结果是不匹配,因此需要多个相邻的点进行能量的均摊。

二.如何抑制这个问题——窗函数

这里我用到了抑制这个词,说明这个问题不是能解决,而是减缓,为了将这个泄漏误差减少到最小程度(注意是减少,不是消除),我们需要使用加权函数,也叫窗函数。加窗主要是为了使时域信号似乎更好地满足FFT处理的周期性要求,减少泄漏。

三.不同窗函数的特性区别

各种窗函数频谱特征的主要差别在于:主瓣宽度(也称为有效噪声带宽,ENBW)、幅值失真度、最高旁瓣高度和旁瓣衰减速率等参数。加窗的主要想法是用比较光滑的窗函数代替截取信号样本的矩形窗函数,也就是对截断后的时域信号进行特定的不等计权,使被截断后的时域波形两端突变变得平滑些,以此压低谱窗的旁瓣。因为旁瓣泄露量最大,旁瓣小了泄露也相应减少了。不同的窗函数具有不同的频谱特征,下表列出了一些常用窗函数的特征。

主瓣宽度主要影响信号能量分布和频率分辨能力。频率的实际分辨能力为有效噪声带宽乘以频率分辨率,因此,主瓣越宽,有效噪声带宽越宽,在频率分辨率相同的情况下,频率的分辨能力越差。

旁瓣高低及其衰减率影响能量泄漏程度(频谱拖尾效应)。旁瓣越高,说明能量泄漏越严重,衰减越慢,频谱拖尾越严重。

加窗函数时,应使窗函数频谱的主瓣宽度应尽量窄,以获得高的频率分辨能力;旁瓣衰减应尽量大,以减少频谱拖尾,但通常都不能同时满足这两个要求。各种窗的差别主要在于集中于主瓣的能量和分散在所有旁瓣的能量之比。

窗的选择取决于分析的目标和被分析信号的类型。一般说,有效噪声频带越宽,频率分辨能力越差,越难于分清有相同幅值的邻近频率。选择性(即分辨出强分量频率邻近的弱分量的能力)的提高与旁瓣的衰减率有关。通常,有效噪声带宽窄的窗,其旁瓣的衰减率较低,因此窗的选择是在二者中取折衷。

最后补充一点,虽然窗函数经常用在时频域,但是对于雷达通信来说,窗函数实际上也用于时域和空域,不同的窗函数加载在不同阵元上的权系数,可以改变空域波束形成的特性。

对于实际信号序列,该如何选取窗函数呢?一般来说,选择第一旁瓣衰减大,旁瓣峰值衰减快的窗函数有利于缓解截断过程中产生的频谱泄漏问题。但具有这两个特性的窗函数,其主瓣宽度较大,相应会带来一些副作用,应用中需根据具体情况折中地选择。

设信号中包含fa和fb两个频率分量,窗函数的选择与两个频率分量的间距以及两个频率分量的幅度比例密切相关。窗函数选择的一般准则如下表所列。
窗函数选择的一般规则

 

主瓣窄的窗函数一般旁瓣泄漏大,频谱泄漏主要集中在旁瓣范围内。旁瓣衰减大的窗函数,一般主瓣较宽,泄漏主要集中在主瓣范围内。

当选择加窗DFT时,已知采样长度N的选择与最小频域分辨率有关,而从上表中看到采样长度N还与窗函数的主瓣宽度相关,所以N的选择应为

N≥(fs/△fmin)K

式中:K为窗函数的主瓣宽度与矩形窗的主瓣宽度之比。
根据窗函数对数据处理的影响,可参照下列原则选取理想的窗函数:
①窗函数频谱的主瓣应尽可能地窄,以提高谱估计时的频域分辨率和减小泄漏。
②尽量减小窗函数频谱的最大旁瓣的相对幅度,以使旁瓣高度随频率尽快衰减。
若以上两条不能同时得到满足,则往往是增加主瓣宽度以换取对旁瓣的抑制。
总之,在应用窗函数时,除要考虑窗函数频谱本身的特性外,还应充分考虑被分析信号的特点及具体处理要求。

案例、设N=256,用boxcar函数产生矩形窗,以N=256进行FFT,又以N=2048点进行FFT,比较它们的谱图。并用hanning函数,hamming函数和blackman函数得到它们的谱图和时域图,程序如下:

clear all; clc; close all;
 
N=256;                         % 窗长度             
x=boxcar(N);                   % 设置矩形窗
y=hanning(N);
z=hamming(N);
w=blackman(N);
% 第一部分
X1=fft(x);                     % FFT
X1_abs=abs(fftshift(X1));      % 计算幅值
freq1=(-128:127)/N;            % 频率刻度1
figure(1);
subplot 311; plot(freq1,X1_abs,'k');      % 作图
xlim([-0.1 0.1]);
xlabel('归一化频率'); ylabel('幅值');
title('(a) 补零前FFT谱图')
% 第二部分
X2=fft(x,N*8);                 % 对矩形窗补零后FFT
X2_abs=abs(fftshift(X2));      % 计算幅值
freq2=(-N*4:N*4-1)/(N*8);      % 频率刻度2
subplot 312; plot(freq2,X2_abs,'k');      % 作图
xlim([-0.1 0.1]);
xlabel('归一化频率'); ylabel('幅值');
title('(b) 补零后FFT谱图')
 
X2_dB=20*log10(X2_abs/(max(X2_abs))+eps); % 幅值取分贝值
 
subplot 313; plot(freq2,X2_dB,'k');       % 作图
axis([0 0.1 -50 5]);
%xlim([-0.1 0.1]);
xlabel('归一化频率'); ylabel('幅值/dB');
title('(c) 补零后FFT谱图-分贝值')
set(gcf,'color','w');
%%
Y2=fft(y,N*8);                 % 对hanning窗补零后FFT
Y2_abs=abs(fftshift(Y2));      % 计算幅值
Y2_dB=20*log10(Y2_abs/(max(Y2_abs))+eps); % 幅值取分贝值
 
Z2=fft(z,N*8);                 % 对hamming窗补零后FFT
Z2_abs=abs(fftshift(Z2));      % 计算幅值
Z2_dB=20*log10(Z2_abs/(max(Z2_abs))+eps); % 幅值取分贝值
 
W2=fft(w,N*8);                 % 对blackman窗补零后FFT
W2_abs=abs(fftshift(W2));      % 计算幅值
W2_dB=20*log10(W2_abs/(max(W2_abs))+eps); % 幅值取分贝值
figure(2);
plot(freq2,Y2_dB,'k');       % 作图
hold on;
plot(freq2,X2_dB,'r');
plot(freq2,Z2_dB,'b');
plot(freq2,W2_dB,'g');
axis([0 0.1 -150 5]);
%xlim([-0.1 0.1]);
xlabel('归一化频率'); ylabel('幅值/dB');
title('补零后FFT谱图-分贝值')
legend('hanning','boxcar','hamming','blackman');
set(gcf,'color','w');
 
figure(3);
plot(hanning(N));hold on;
plot(boxcar(N));
plot(hamming(N));
plot(blackman(N));
legend('hanning','boxcar','hamming','blackman');
title('四种窗函数的时域波形图');
 

 

 

程序第一部分中(第一张图片),N=256,作256点的FFT,得图1(a)。从图中可看
到矩形窗的谱图并不只有一条谱线,且没有泄漏。这是怎么回事?
矩形窗的谱函数为

在N点DFT后离散频率为wk=2πk/N(k=C,1,…,N-1)。把wk代入上式可以发现,除k=0外,其他频点的幅值都为0,这就是为什么在图1(a)中除0点有谱线外,其他都为0值。

要得到常见的矩形窗谱图(把0值之间泄漏的值都能绘制出来),可以通过对数据补零得到。在程序第二部分N=256,但FFT变换长度L=2048,其中在数据后补了1792(256*7)个零值。FFT后的结果见图1(b),同时对FFT后的幅值取分贝值后的结果见图1(c),这就是我们常见的矩形窗的谱图。

同时在程序第二部分,我们得到了四种窗函数的时域波形和频谱图。

参考文献:MATLAB数字信号处理85个实用案例精讲——入门到进阶;宋知用(编著)
 

在所有​ ​窗函数​​中,大多你都可以在网上找到该窗函数的介绍,但是今天介绍的Vorbis窗,至少你不仔细找,可能还真找不到它的资料。

要得到常见的矩形窗谱图(把0值之间泄漏的值都能绘制出来),可以通过对数据补零得到。在程

原文链接:https://blog.csdn.net/qq_42233059/article/details/126479487

——————————————————

Wikipedia里的窗函数介绍里是没有这个窗函数的。

直接上干货

窗函数公式

w ( n ) = s i n ( π 2 s i n 2 ( π n N ) ) w(n) = sin(\frac \pi2 sin^2(\frac{\pi n} N) ) w(n)=sin(2πsin2(Nπn))

 

窗函数图

 

可以看到它的顶部更圆润,可以保留更多的信息。

它与我们常见的Hann window相比呢

 

通过对比可以看到他更像是一个“发福”版的Hann window

不过神奇的是它也满足Princen-Bradley条件,即分析窗和合成窗满足函数乘积和为1.所以分析窗和合成窗都使用该窗可以完美做时域/频域的转换。



https://blog.51cto.com/u_15473842/4882038

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
语音处理中,分帧是一个基础而且重要的概念。由于语音信号是随时间变化的,为了方便处理需要将语音信号分成一帧一帧的小块。为什么要这样做呢?主要原因有以下几点: 1.方便处理:如果将整个语音信号作为一个整体进行处理,数据量太大,容易造成计算机负担过大,处理速度慢。而将语音信号分成若干帧,每帧的大小通常是10ms~30ms之间,这样就可以把语音信号划分成若干个小段,方便进行处理。 2.避免信息混淆:采用分帧的方法可以避免不同的语音信号之间信息的混淆。如果不分帧的话,就会出现不同的语音信号交错混合在一起,导致整个语音信号变得复杂起来,就不容易分析和处理。 MATLAB作为一个常用的语音处理工具,采用不同函数语音信号进行分帧操作。所谓函数,就是在语音信号进行分帧的过程中,给每一帧信号加上一个函数进行平滑处理函数根据不同的需求和目的有很多种,可以选择不同的函数来进行分帧操作。 MATLAB在进行分帧操作时,常用的函数有汉明、矩形、三角等。汉明函数较大的特点是抑制了边缘上的振荡,逼近于一个串区,因此在声谱分析中被大量使用,能够有效的消除滤波器带来的误差;矩形函数则是一种简单而常用的函数,其优点是在频域上不会使谱泄露,缺点是边界频率带上会产生微弱的贡献,但由于其运算效率较高,被广泛使用;三角函数是一个前部分升起,后部分下降的三角形,在语音信号分析中可以较好地模拟口变化,常被用于分析不同时间分辨率对语音信号特征提取的影响。 以上是MATLAB采用不同函数语音分帧的一些基本介绍,不同的函数具有各自的优缺点,选择合适的函数可以提高语音信号的分析和处理能力。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值