主要内容

upfirdn

上采样、应用 FIR 滤波器和下采样

说明

yout = upfirdn(xin,h) 使用冲激响应为 h 的 FIR 滤波器对输入信号 xin 进行滤波。此语法不实现上采样或下采样。

yout = upfirdn(xin,h,p) 指定整数上采样因子 p

yout = upfirdn(xin,h,p,q) 指定整数下采样因子 q

示例

示例

全部折叠

按有理转换因子将信号的采样率从 DAT 速率 48 kHz 更改为 CD 采样率 44.1 kHz。使用 rat 函数查找有理因子的分子 L 和分母 M

Fdat = 48e3;
Fcd = 44.1e3;
[L,M] = rat(Fcd/Fdat)
L = 
147
M = 
160

生成以 fDAT 采样的 1.5 kHz 正弦波,采样时间持续 0.25 秒。绘制第一个毫秒的信号。

t = 0:1/Fdat:0.25-1/Fdat;
x = sin(2*pi*1.5e3*t);
stem(t,x)
xlim([0 0.001])
hold on

Figure contains an axes object. The axes object contains an object of type stem.

使用凯塞窗设计一个抗混叠低通滤波器。将滤波器频带边缘设置为截止频率 (fDAT/2)×min(1/L,1/M) 的 90% 和 110%。指定通带波纹为 5 dB,阻带衰减为 40 dB。将通带增益设置为 L

f = (Fdat/2)*min(1/L,1/M);
d = designfilt('lowpassfir', ...
    'PassbandFrequency',0.9*f,'StopbandFrequency',1.1*f, ...
    'PassbandRipple',5,'StopbandAttenuation',40, ...
    'DesignMethod','kaiserwin','SampleRate',48e3);
h = L*tf(d);

使用 upfirdn 和滤波器 h 对正弦波重采样。计算并补偿滤波器引入的延迟。生成对应的重采样时间向量。

y = upfirdn(x,h,L,M);

delay = floor(((filtord(d)-1)/2-(L-1))/L);
y = y(delay+1:end);
t_res = (0:(length(y)-1))/Fcd;

在图上叠加重采样的信号。

stem(t_res,y,'*')
legend('Original','Resampled','Location','southeast')
hold off

Figure contains an axes object. The axes object contains 2 objects of type stem. These objects represent Original, Resampled.

输入参数

全部折叠

输入信号,指定为向量或矩阵。如果 xin 是向量,则它表示单个信号。如果 xin 是矩阵,则独立对每列进行滤波。有关详细信息,请参阅提示

数据类型: single | double

滤波器冲激响应,指定为向量或矩阵。如果 h 是向量,则它表示一个 FIR 滤波器。如果 h 是矩阵,则每列是一个单独的 FIR 冲激响应序列。有关详细信息,请参阅提示

数据类型: single | double

上采样因子,指定为正整数。

数据类型: single | double

下采样因子,指定为正整数。

数据类型: single | double

输出参量

全部折叠

输出信号,以向量或矩阵形式返回。yout 的每列的长度为 ceil(((length(xin)-1)*p+length(h))/q)

如果 upfirdn 的输入是单精度值,则该函数返回单精度的 yout

注意

由于 upfirdn 执行卷积和速率更改,输出信号 yout 的长度与输入信号 xin 不同。yout 的行数大约是 xin 的行数的 p/q 倍。

提示

xinh 大小的有效组合是:

  1. xin 是向量且 h 是向量。

    输入是一个滤波器和一个信号,因此函数将 xinh 进行卷积。如果 xin 是行向量,则输出信号 yout 是行向量;否则,yout 是列向量。

  2. xin 是矩阵且 h 是向量。

    输入是一个滤波器和多个信号,因此函数将 hxin 的每列进行卷积。得到的 yout 是与 xin 列数相同的矩阵。

  3. xin 是向量且 h 是矩阵。

    输入是多个滤波器和一个信号,因此函数将 h 的每列与 xin 进行卷积。得到的 yout 是与 h 列数相同的矩阵。

  4. xin 是矩阵且 h 是矩阵,两者具有相同的列数。

    输入是多个滤波器和多个信号,因此函数将 xinh 的对应列进行卷积。得到的 yout 是与 xinh 列数相同的矩阵。

算法

upfirdn 使用一个多相插值结构体。多相结构体中乘加运算的数量约为 (LhLxpLx)/q,其中 LhLx 分别是 h(n) 和 x(n) 的长度。对于长信号,此公式通常是精确的。

upfirdn 以级联方式执行三项操作:

  1. 按整数因子 p 对矩阵 xin 中的输入数据进行上采样(插入零值)

  2. 使用在向量或矩阵 h 中给出的冲激响应序列对上采样信号数据进行 FIR 滤波

  3. 按整数因子 q 对结果进行下采样(丢弃采样)

FIR 滤波器通常是低通滤波器,您必须使用另一个函数(如 firpmfir1)来设计它。

注意

函数 resample 使用 firls 执行 FIR 设计,然后使用 upfirdn 实现速率更改。

参考

[1] Crochiere, R. E. "A General Program to Perform Sampling Rate Conversion of Data by Rational Ratios." Programs for Digital Signal Processing (Digital Signal Processing Committee of the IEEE Acoustics, Speech, and Signal Processing Society, eds.). New York: IEEE Press, 1979, Programs 8.2-1–8.2-7.

[2] Crochiere, R. E., and Lawrence R. Rabiner. Multirate Digital Signal Processing. Englewood Cliffs, NJ: Prentice-Hall, 1983.

扩展功能

全部展开

C/C++ 代码生成
使用 MATLAB® Coder™ 生成 C 代码和 C++ 代码。

版本历史记录

在 R2006a 之前推出

全部展开