音 频信号的读取
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。
看到这里了,点个赞呗!