主要内容

upfirdn

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

说明

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

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

示例

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

示例

示例

全部折叠

自 R2026a 起

设计一个 50 阶 FIR 低通滤波器,以隐藏上采样产生的成像伪影。上采样因子为 5。计算滤波器的群延迟和冲激响应。

p = 5;

n = 50;
h = p*fir1(n,1/p);
dl = grpdelay(h,1,1);
freqz(h)

Figure contains 2 axes objects. Axes object 1 with title Phase, xlabel Normalized Frequency (\times\pi rad/sample), ylabel Phase (degrees) contains an object of type line. Axes object 2 with title Magnitude, xlabel Normalized Frequency (\times\pi rad/sample), ylabel Magnitude (dB) contains an object of type line.

定义在采样率为 30 Hz 下持续一秒的线性扫频余弦(啁啾)信号。

Fs = 1e3;
t = single(0:1/Fs:1)';
x = chirp(t,20,t(end),150);

对该啁啾信号进行滤波和上采样。由于输入信号是单精度,输出也是单精度。

xu = upfirdn(x,h,p);

比较输入信号和输出信号。补偿滤波器引入的延迟。生成对应的重采样时间向量。

xu = xu(dl+1:end);
tu = single(0:(length(xu)-1))/(Fs*p);
plot(t,x,".-",MarkerSize=10)
hold on
plot(tu,xu,".-",MarkerSize=4)
hold off
xlim([0 0.5])
xlabel("Time (s)")
legend(["x" "xu"])

Figure contains an axes object. The axes object with xlabel Time (s) contains 2 objects of type line. These objects represent x, xu.

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

Fdat = 48e3;
Fcd = 44.1e3;
[p,q] = rat(Fcd/Fdat)
p = 
147
q = 
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])
xlabel("Time (s)")
hold on

Figure contains an axes object. The axes object with xlabel Time (s) 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/p,1/q);
d = designfilt("lowpassfir", ...
    PassbandFrequency=0.9*f,StopbandFrequency=1.1*f, ...
    PassbandRipple=5,StopbandAttenuation=40, ...
    DesignMethod="kaiserwin",SampleRate=48e3);
h = p*tf(d);

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

y = upfirdn(x,h,p,q);

delay = floor(((filtord(d)-1)/2-(p-1))/p);
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 with xlabel Time (s) contains 2 objects of type stem. These objects represent Original, Resampled.

输入参数

全部折叠

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

数据类型: single | double

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

数据类型: single | double

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

数据类型: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

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

数据类型: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

输出参量

全部折叠

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

如果将 xh 指定为 single 类型,则 upfirdn 使用单精度算术执行滤波运算,并以单精度返回 y。否则,upfirdn 返回类型为 doubley

注意

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

提示

xh 大小的有效组合是:

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

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

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

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

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

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

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

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

算法

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

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

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

  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++ 代码。

GPU 代码生成
使用 GPU Coder™ 为 NVIDIA® GPU 生成 CUDA® 代码。

版本历史记录

在 R2006a 之前推出

全部展开