语音信号预加重与去加重(Matlab+Keil)

2 篇文章 0 订阅
1 篇文章 0 订阅

语音信号的预加重与去加重(M atlab+Keil)

音 频信号的读取

M atlab代码

[y,Fs,nbit] = wavread('szdx.wav');%16位采样精度,24k采样频率
len=length(y);
y=y(:,1);
t=(1:len)/Fs;
N=256;%帧长256
zhen=len/N;%358

画图

subplot 321
plot(t,y)%时域
fft_y=fft(y);
f=linspace(-Fs/2,Fs/2,len);
subplot 322
plot(f,abs(fft_y));%频域

预加重

原理(简略)

预加重就是音 频信号高频部分加强,低频部分减弱
传递函数为H(z)=1-aZ^-1
也可以通过y(n)=x(n)-ax(n-1)来表示,这里取a=0.98

M atlab代码

y4=zeros(len,1);
for i=0:zhen-1
    y2=y(i*256+1:i*256+256);%取帧
    y3=zeros(N,1);
    y3(1,1)=y2(1,1);%每帧第一个数据为原信号数据
    for j=2:N
      y3(j)=y2(j)-0.98*y2(j-1);
    end
    y4(i*256+1:i*256+256)=y3;%y4为时域预处理后的信号
end

画图

subplot 323
plot(t,y4)%时域
fft_y=fft(y4);
f=linspace(-Fs/2,Fs/2,len);
subplot 324
plot(f,abs(fft_y));%频域

Keil代码

void sendPreEmphasis(float *inBuf,float *outBuf,short len)
{
	register int i = 0;
	static float firstData = 0.0;
	outBuf[0] = inBuf[0] - ((float)0.98*firstData);
	for(i=1;i<len;i++)
	{
		outBuf[i] = inBuf[i] - ((float)0.98*inBuf[i-1]);
		debug("%f\r\n",outBuf[i]);
		osDelay(10/portTICK_RATE_MS);
	}
	
	firstData = inBuf[len-1];

	register int i = 0;
	for(i=0;i<len;i++)
	{
		outBuf[i]=inBuf[i];
	}	
}

去加重

去加重的原理通过y(n)=x(n)+ay(n-1)来表示,这里取a=0.98

M atlab代码

z4=zeros(len,1);
for i=0:zhen-1
    z2=y4(i*N+1:i*N+N);%取帧
    z3=zeros(N,1);
    z3(1,1)=z2(1,1);%每帧第一个数据为原数据
    for j=2:N
      z3(j)=z2(j)+0.98*z3(j-1);
    end
    z4(i*256+1:i*256+256)=z3;%z4为去处理后的时域信号
end

画图

subplot 325
plot(t,z4)%时域
fft_y=fft(z4);
f=linspace(-Fs/2,Fs/2,len);
subplot 326
plot(f,abs(fft_y));%频域

Keil代码

static void deEmphasis(float* lfBufOut ,float* deEmBufOut)
{
	short i=0;
	static float RegDeEm=0;
	for(i=0;i<SEND_SIZE;i++){
		deEmBufOut[i]=lfBufOut[i]+0.98*RegDeEm;
		RegDeEm=deEmBufOut[i];
	}
	short i=0;
	static float RegDeEm=0;
	for(i=0;i<SEND_SIZE;i++){
		deEmBufOut[i]=lfBufOut[i]; 
	}
}

最终时频图

在这里插入图片描述
第一行为原始信号时频图
第二行为预加重后的信号时频图
第三行为去加重后的信号时频图
频谱图横坐标有误没改,代码忘加fftshift了,总之频谱的意思就是0-2pi。

看到这里了,点个赞呗!

  • 9
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值