一.用FFT实现有限长序列的线性卷积:
给定两个序列x=[2,1,1,2],h=[1,-1,-1,1]
1、直接计算两个序列的线性卷积;
2、用FFT实现线性卷积,并和1的结果对比分析。
clear all;close all;x = [2,1,1,2];h = [1,-1,-1,1];nx = length(x);nh = length(h);%第一问%直接计算线性卷积y = conv(x,h)%第二问%重叠相加法计算线性卷积x0 = zeros(1,nx+nh-1);x0(1:nx)=x(1:4);h0 = zeros(1,nx+nh-1);h0(1:nh)=h(1:4);y0 = fftfilt(x0,h0)%两种计算方法的差异delta_y = y0-y
实验结果:
结果分析:
图1-1中y为直接线性卷积的结果,y0为补领后采用重叠相加发(fftflit)的结果,二者相等.
二、两个音频信号“Female.wav”and “male.wav”二选一,进行如下实验:
1、读出所给音频信号x(t),确定该音频信号的采样率;画出该音频信号的时域波形和频谱图;
2、对音频信号人为加噪声,回放音频信号,感觉和原来有什么不同?
3、对加噪声后的信号,用滑动平均滤波器进行滤波(用重叠相加法fftfilt实现),得到滤波后的音频信号f(t);
4、对比原信号x(t)和滤波后音频信号f(t)的波形及频谱。播放这两个音频信号,感觉前后声音的变化
close all;clear all;[x,fs] = wavread('a_Female.wav');nx = length(x);sound(x);%采样频率fs = 16000;X = fft(x);Y = abs(fftshift(X));%图一,音频时域和频域figuresubplot(211)plot(x)title('音频时域')subplot(212)plot(Y)title('音频频域')%图二figure%噪声方差sigma = 0.05;r = normrnd(x,sigma);nr = length(r);sound(r);R = fft(r);YR = abs(fftshift(R));subplot(211)plot(r)title('音频时域(加噪声)')subplot(212)plot(YR)title('音频频域(加噪声)')%图三nw = 10;%窗长w = ones(1,nw);r0 =zeros(1,nr+nw-1);w0 = zeros(1,nr+nw-1);r0(1:nr) = r(1:nr);w0(1:nw) = w(1:nw);f = fftfilt(r0,w0);sound(f);F=fft(f);YF=abs(fftshift(F));figuresubplot(211)plot(f)title('音频时域(滤波)')subplot(212)plot(YF)title('音频频域(滤波)')
结果分析:
首先通过设定噪声的方差调整噪声的影响,此代码中设定为sigma=0.05.实验过程中尝试过将sigma=1,0.1,0.01.sigma=1时基本全是噪声且很响;sigma=0.1时,原声被噪声影响也较大;sigma=0.01时基本没影响;最终选择为0.05.
实验过程中一次听三段音频(原音频,加噪声音频和滤波后音频),结果是基本能听清滤波后的信号.
通过对比图2-1,2-2,2-3,也可以看出重叠相加法在能滤掉高频的噪声.
三、 一LTI系统的系统函数如下:
1、分解成2阶系统的级联;
2、分解成1阶系统的级联;
3、画零极点分布图;(要求分别用zplane(b,a)和zplane(z,p)画)
4、系统的频率响应的幅度响应和相位响应
close all;clear all;num = [0.1,0.12,0.02];den = [1,-0.2,2.42,-1.312,0.64];[z,p,k]=tf2zp(num,den)sos=zp2sos(z,p,k)[sos, G]=tf2sos(num,den)%图三figuresubplot(211)zplane(num,den)title('zplane(num,den)')%由于此算法是先化成正次幂,会含有z=0的两个零点subplot(212)zplane(z,p)title('zplane(z,p)')%由于此算法是直接算负次幂,会漏掉Z=0的两个零点%图四N=1000;[H,f]=freqz(num,den,N);figuresubplot(211)plot(abs(H))title('幅度相应')subplot(212)plot(angle(H))title('相位相应')
结果分析
sos=zp2sos(z,p,k)
算法1是先将分子分母化成正次幂,会含有z=0的两个零点
[sos, G]=tf2sos(b,a)
算法2是直接算负次幂,会漏掉Z=0的两个零点