向上确认
提高采样率,使用FIR滤波器,降低采样率。
库::`工程师`
争论
例子:
将DAT采样率转换为CD采样率
Details
让我们使用采样频率dat的有理转换因子来更改信号的采样频率 48 kHz至CD采样率 44.1 千赫。 使用函数 合理化 让我们找到分子 L 和分母 M 的有理系数。
import EngeeDSP.Functions: upfirdn, kaiserord, fir1, kaiser
Fdat = 48e3
Fcd = 44.1e3
r = rationalize(Fcd/Fdat)
L = numerator(r)
M = denominator(r)
println("L=",L,", M=",M)
L=147, M=160
产生频率的正弦 1.5 带采样周期的kHz 平等 0.25 C.让我们绘制信号的第一毫秒。
t = 0:1/Fdat:0.25-1/Fdat
x = sin.(2π * 1.5e3 * t)
scatter(t, x, markershape=:circle, markersize=3, line=:stem, label="signal")
xlims!(0, 0.001)

让我们使用Kaiser窗口设计一个具有平滑的低通滤波器。 让我们将滤波器带的边界设置为 90%及 110 截止频率的%, . 设置带宽中的纹波 5 dB和延迟带中的衰减 40 分贝。 让我们将带宽中的增益设置为 L.
Fs = 48e3
f = (Fdat/2) * min(1/L, 1/M)
Wp = 0.9*f / (Fs/2)
Ws = 1.1*f / (Fs/2)
Rp = 5
Rs = 40
n, Wn, beta = kaiserord([Wp, Ws], [1, 0], [10^(-Rp/20), 10^(-Rs/20)])
b = fir1(n, Wn, kaiser(n+1, beta))
h = L * b
使用函数 向上确认 带过滤器 h 来重新采样正弦波。 计算并补偿滤波器引入的延迟。 我们将生成相应的过采样时间矢量。
y = upfirdn(x, h, L, M)
delay_float = ((length(h) - 1) / 2 - (L - 1)) / L
delay = floor(Int, delay_float)
y = y[delay+1:end]
t_res = (0:length(y)-1) / Fcd
让我们在图表上显示原始和过采样信号。
plot(t, x, line=:stem, marker=:circle, markersize=2,
label="Original (48 kHz)", color=:red,
xlims=(0, 0.001), title="Signal Comparison",
xlabel="Time (s)", ylabel="Amplitude")
scatter!(t_res, y, markershape=:circle, markersize=2,
label="Resampled (44.1 kHz)", color=:blue)

建议
-
新-向量及h-矢量。输入端有一个滤波器和一个信号,因此函数崩溃
新与h. 的输出信号[参数:yout]是一个字符串向量,如果新-vector-string;否则你-列向量。 -
新-矩阵,以及h-矢量。输入端有一个滤波器和许多信号,因此函数崩溃
h每列新. 由此产生的你-与列数相同的矩阵新. -
新-矢量,嗯h-矩阵。输入端有多个滤波器和一个信号,因此函数会折叠每列。
h与新. 由此产生的你-与列数相同的矩阵h. -
新-矩阵和h-一个矩阵,都具有相同的列数。输入端有多个滤波器和多个信号,因此函数会折叠相应的列。
新和h. 由此产生的你-与列数相同的矩阵新和h.