程中,要注意采样频率与原始采样频率及插值或抽取系数的关系。MATLAB实现插值或抽取的函数有decimate、interp和resample。
以2倍抽取为例,将(3)中的经过滤波后产生的XPquitFilter.WAV文件进行数据转换
处理。以下为其实现程序:
clear; close all; clc;
[x,FS,NBITS]=wavread('XPquitFilter.WAV');% 将WAV文件转换成变量
N=length(x);% 计算数据点数
% 不是偶数点化成偶数点
if mod(N,2)==0; N=N; else x(N)=[]; N=N-1; end;
% 原信号波形频谱分析
tx=(0:N-1)/FS;% 计算原信号数据点时刻
subplot(3,2,1);plot(tx,x);% 绘制原信号波形
title('原信号波形图');% 加标题
xf=fft(x);% 求原信号频谱
fx=(0:N/2)*FS/N;% 确定频谱图频率刻度
subplot(3,2,2);plot(fx,abs(xf(1:N/2+1)));% 绘制原信号频谱
title('原信号频谱图');% 加标题
% 实现数据抽取
k=[1:N/2];% 确定抽取位置
y=x(2*k);% 实现抽取后的数据
M=length(y);% 计算抽取后数据点数
% 抽取数据在原采样频率FS下的波形频谱分析
ty=(0:M-1)/FS;% 计算数据点时刻
subplot(3,2,3);plot(ty,y);% 绘制信号波形图
title('原采样率下新波形图');% 加标题
yf=fft(y);% 求频谱
fy=(0:M/2)*FS/M;% 确定频谱图频率刻度
subplot(3,2,4);plot(fy,abs(yf(1:M/2+1)));% 绘制频谱图
title('原采样率下新频谱图');% 加标题
% 抽取数据在FS/2采样频率下的波形频谱分析
tz=(0:M-1)/(FS/2);% 计算数据点时刻
subplot(3,2,5);plot(tz,y);% 绘制信号波形图 title('新采样率下新波形图');% 加标题
fz=(0:M/2)*(FS/2)/M;% 确定频谱图频率刻度
subplot(3,2,6);plot(fz,abs(yf(1:M/2+1)));% 绘制频谱图
title('新采样率下新频谱图');% 加标题
% 实现数据转换
wavwrite(y,FS/2,NBITS,'XPquit16B.WAV');% 音频格式PCM 11025Hz 16位
wavwrite(y,FS/2,NBITS/2,'XPquit8B.WAV');% 音频格式PCM 11025Hz 8位
测试结果:运行程序,得到如图结果