数据转换是指改变音频格式中的采样频率或量化位数
转换原理:
先用矩阵插值或抽取技术实现变量变换
如果是抽取数据还需在变换前作滤波处理使之满足采样定理
变量变换完成后再用
audioread函数重新定义量化位数和采样频率即可实现数据转换
数据转换过程中,要注意采样频率与原始采样频率及插值或抽取系数的关系
MATLAB 实现插值或抽取的函数有 decimate ,interp 和 resample
这里以 2 倍抽取为例 将012617137-scuba-diver-3Filter.WAV 文件进行数据转换处理 具体程序如下
clear;
close all;
clc;
[x,FS]=audioread('012617137-scuba-diver-3Filter.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(' 新采样率下新频谱图 '); % 加标题
% 实现数据转换
audiowrite ('XPquit16B.WAV',y,FS/2); % 音频格式 PCM
运行程序 在得到的图形窗口中 执行 Edit/Axes Properties命令 再把各分图下 X 标签中的 Limits 设为 0,0.01 和 0, 1000 得到 0--0.01 秒的波形和 0 --1000Hz 的频谱如图所示
由图可知在满足采样定律条件下,实现数据抽取
在原采样率下波形变密频谱变宽且幅度减半
但在新采样率下波形和频谱都很好
通过试听输出文件还可感受处理效果