分数倍采样率转换:
在工程中,输入采样率和输出采样率不都是整数倍关系,常常出现分数倍采样率的转换(如音频采样率44.1KHz转换到48KHz等)。分数倍采样率转换的实现方法有很多,常见的有多相结构、拉格朗日插值(Farrow结构)、三次样条插值等。
分数倍采样率转换多相结构:
这里,先介绍多相结构,有需要仔细了解分数内插原理的话可以阅读多采样率数字信号处理相关的资料。
在分数内插过程中,常用P表示滤波器的内插因子,Q表示抽取因子,
因此,
输出采样率=输入采样率*P/Q;
P>Q则是内插,P<Q则是抽取。
法罗滤波器是一种多相滤波器,其的核心思想就是对原型滤波器系数进行重组。
假设,原型滤波器的系数为a,...t,插值因子P=5,抽取因子Q=3。输出滤波器相位步进为Q。
lmmax = max(L,M); % 抽取因子或插值因子
fc = 1/2/lmmax; % 截止频率
h=firls(N-1,[0 2*fc 2*fc 1],[1 1 0 0].*kaiser(N,beta)'; % ls方式计算滤波器系数,kaiser为窗函数,可按情况选择
拉格朗日插值的法罗结构:
法罗结构是拉格朗日插值的一种高效实现。方法就是将代入滤波器组即可。
% 法罗插值的算法
% y=[uk^3 uk^2 uk^1 1]*(C*[x(k) x(k-1) x(k-1) x(k-3)]')
% 其中uk为分数间隔,C为固定系数,x为输入采样,非常适合用fpga实现。
% 可用于任意倍率(插值或抽取)的采样率变换。
t=(0:999)/48e3;
x=sin(2*pi*1e3*t); % 产生48KHz采样率,1KHz的正弦波。
% 系数
v3=[-1/6 1/2 -1/2 1/6];
v2=[1/2 -1 1/2 0];
v1=[-1/3 -1/2 1 -1/6];
v0=[0 1 0 0];
C = [v3;v2;v1;v0];
L=7; % 插值因子
M=3; % 抽取因子
k=1;
xbuf=zeros(4,1);
pha=0;
for i=1:length(x)
xbuf=[x(i);xbuf(1:end-1)]; % FPGA实现时采用移位寄存器
xf=C*xbuf; % 移位寄存器的数据分别用v3,v2,v1,v0进行滤波
pha = pha + L;
while pha >= M
uk = pha/L; % 计算输出采样点的相对位置
y(k)=xf(1)*uk^3+xf(2)*uk^2+xf(3)*uk+xf(4); % fpga实现时采用乘法器流水
pha = pha - M; % 更新输出采样点后的相位
k = k + 1; % 更新输出索引
end
end
y(1:4)=[];
t1=(0:length(y)-1)/(48e3*L/M);
plot(t,x,'--*',t1,y,'--o');
后记:
由于该结构非常适合FPGA实现,只需要在数据输入加一级缓存(FIFO/RAM),随后根据相位选择进行滤波即可。
Matlab的仿真如下:farrow_exam.rar_farrow_farrow MATLAB_matlab例程_数值算法/人工智能下载-pudn.com
音频重采样的Verilog代码:audioresample(音频重采样)_音频重采样的三种方法,音频重采样-其它代码类资源-CSDN下载