分数倍采样率转换

本文探讨了在音频处理中,如何实现输入与输出采样率不是整数倍关系时的分数倍采样率转换。介绍了多相结构、拉格朗日插值(Farrow结构)、三次样条插值等常见方法,以及法罗滤波器在分数内插中的应用,特别强调了其在FPGA上的高效实现。
摘要由CSDN通过智能技术生成

分数倍采样率转换:

在工程中,输入采样率和输出采样率不都是整数倍关系,常常出现分数倍采样率的转换(如音频采样率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为窗函数,可按情况选择

拉格朗日插值的法罗结构:

法罗结构是拉格朗日插值的一种高效实现。方法就是将u_{k}代入滤波器组即可。

% 法罗插值的算法
% 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下载

评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值