世界杯奖项

离散信号重采样技术

离散信号重采样(采样率转换)通常有两种实现办法

1】一种是通过DA转换成模拟信号然后再通过AD重新对模拟信号进行采样

2】一种是通过插值的办法在对输入信号进行插值或者抽取的方式,完成纯数字域的采样率转换

本文主要记录第二种方法

1.通过插值公式实现对原始信号的重构

观察以上公式,gt函数中sin(pi*t/T)的周期为1/2*Fx=1/(2T),即gt频率是原信号采样频率的1/2。

< 例一 >

先形象的了解一下插值函数g(t)

插值函数图形,其中Fs取20,Tx=1/Fs

假设我们有信号连续时间信号x(t)=cos(2*pi*f*t+phi),并以Fs=20的速度对x(t)进行采样,得到x(n),并有如下图形:

对连续时间信号xt进行采样,采样率Fs=20;其中f=2Hz,phi=0.2

现在我们要根据采样获得的这些离散点,结合插值的方法得到原来的xt连续信号:

信号重构过程

在上图中,经过n=0:20的累加过程,已经有一部分信号十分贴近于连续原始信号xt,只是在两端点位置因为截断问题,有一些频谱泄露,可以证明如果n的取值范围为(-∞,∞)时,可以完整重构原始连续信号xt。

2.离散时间信号的插值重构

现在我们对插值公式进行一些处理,对插值信号gt按照1/Ty的频率进行采样,就可以得到一个重构函数序列的计算公式

序列结构如下图

gt的采样频率 = 原始信号xt的采样频率Fs

将采样周期为Tx的输入x(nTx)序列与这个插值序列卷积,就得到了一个经过插值的序列y(mTy),插值后采样周期变为Ty,插值后输出序列的第m个元素记为以下形式:

公式1

如果输入序列x长度n=10,那么每计算一个y(mTy)值,需要相应的将g(mTy)计算出来后平移n-1次,然后乘以系数x(nTx),再求加和,也就是说x序列越长,g就需要求取相应更多次的平移序列,这需要很大的计算量。

标题

通过对公式1的观察,我们可以看出,插值后的结果y(mTy)是x(nTx)与g(nTx)卷积的结果(也可以将y(mTy)看做是线性时不变系统g(nTx)对信号x(nTx)的响应),即Y(z)=X(z)*G(z),卷积后结果y(mTy)是对原是信号xt的周期采样,也即y(mTy)=x(nTy),采样周期为Ty,采样频率为1/Ty,由此完成了x(nTx)到x(mTy)的采样频率转换。同时我们观察会发现,插值信号的采样频率1/Ty最终决定了y(mTy)的采样周期,因此要想从1/Ty中恢复xt,1/Ty须大于等于xt中最高频率成分的2倍频。

针对公式1,进行代码验证,代码如下

clc

clear

close all

%% 参数配置

t = -1:0.001:1;

tx1 = 0:0.001:1;

% 原始信号频率以及采样参数,1/Tx=Fx≥2fsignal,Fx≥2*fignal,Fx=2*fg

fsignal = 2; % 原连续信号的频率,通常插值函数的频率≥2*原始信号的频率

Fx = 20; % 对原信号进行采样的采样频率,应该≥2fsignal,对应gt的频率1/2

phi = 0.2;

Tx = 1/Fx;

tx = 0:Tx:1;

% 插值函数采样相关参数,插值函数的原始频率fg=1/2*Fx≥fh

Fsy = 5; % 对插值函数进行采样的频率,应该大于等于2*fsignal

Ty = 1/Fsy;

txy = 0:Ty:1;

ty = (-1:Ty:1)+10^(-10);

%% 插值函数原始图形

gt = (sin(pi*t/Tx)./(pi*t/Tx));

figure(1)

subplot(311)

plot(t,sin(pi*t/Tx))

title('sin(pi*t/Tx)')

xlabel('t=-1:0.001:1')

subplot(312)

plot(t,(pi*t/Tx))

title('pi*t/Tx')

xlabel('t=-1:0.001:1')

subplot(313)

plot(t,gt)

title('gt')

xlabel('t=-1:0.001:1')

ylabel('gt')

%% 信号函数与采样

xt = cos(2*pi*fsignal*tx + phi);

xt1 = cos(2*pi*fsignal*tx1 + phi);

figure(2)

hold on

stem(tx,xt,'LineStyle','none')

plot(tx1,xt1)

title('以Fs为采样周期对xt进行采样')

xlabel('tx=0:1/Fx:1,tx1=0:0.001:1')

%% 信号重构

ytn = zeros(length(tx),length(t));

xtn = zeros(length(tx),length(t));

for iloop1 = 1:Fx+1

ytn(iloop1,:) = xt(iloop1)*(sin(pi*(t-(iloop1-1)*Tx)/Tx)./...

(pi*(t-(iloop1-1)*Tx)/Tx));

xtn(iloop1,:) = t+(iloop1-1)*Tx;

end

figure(3)

subplot(411)

hold on

plot(t,ytn(1,:))

plot(t,ytn(2,:))

plot(t,ytn(3,:))

hold off

legend('n=0','n=1','n=3')

title('x(nTx)*g(t-nTx)')

xlabel('t=-1:0.001:1')

subplot(412)

hold on

plot(t,sum(ytn(1:3,:)))

plot(t,ytn(4,:))

hold off

legend('sum(1:3)','n=4')

title('x(nTx)*g(t-nTx)')

xlabel('t=-1:0.001:1')

subplot(413)

hold on

plot(t,sum(ytn(1:4,:)))

plot(t,ytn(5,:))

hold off

legend('sum(1:4)','n=5')

title('x(nTx)*g(t-nTx)')

xlabel('t=-1:0.001:1')

subplot(414)

hold on

plot(t,sum(ytn))

plot(t,ytn(Fx+1,:))

plot(tx1,xt1)

hold off

legend('sum(1:21)','n=21','xt')

title('重构信号ytvs原始连续信号xt对比')

xlabel('t=-1:0.001:1')

%% 对原连续信号xt按照周期Ty进行采样,得到xty

xty = cos(2*pi*fsignal*txy + phi);

xt1 = cos(2*pi*fsignal*tx1 + phi);

figure(4)

hold on

stem(txy,xty,'LineStyle','none')

plot(tx1,xt1)

title('以Fs为采样周期对xt进行采样')

xlabel('txy=0:Ty:1,tx1=0:0.001:1')

%% 对重构信号进行采样,采样周期为Ty

gty = (sin(pi*ty/Tx)./(pi*ty/Tx));

figure(5)

hold on

stem(ty,gty,'LineStyle','none')

plot(t,gt)

hold off

title('对gt进行采样')

xlabel('t=-1:0.001:1,ty=-1:1/Fsy:1')

%% 利用两次采样的结果xty,gty得到一个新的信号,验证这个信号是否是原连续信

% 号按照Ty采样的结果

ytnd = zeros(length(tx),length(ty));

xtnd = zeros(length(tx),length(ty));

ytndSum = zeros(length(tx),length(ty)*(length(tx)-1));

xtndSum = zeros(length(tx),length(ty)*(length(tx)-1));

tySum = -1:Ty*Tx:1+(Fx-1)*Ty*Tx;

for iloop1 = 1:Fx+1

ytnd(iloop1,:) = xt(iloop1)*(sin(pi*(ty-(iloop1-1)*Tx)/Tx)./...

(pi*(ty-(iloop1-1)*Tx)/Tx));

xtnd(iloop1,:) = ty+(iloop1-1)*Tx;

end

figure()

subplot(311)

grid on

hold on

stem(xtnd(1,:),ytnd(1,:))

stem(xtnd(2,:),ytnd(2,:))

stem(xtnd(3,:),ytnd(3,:))

stem(xtnd(4,:),ytnd(4,:))

xlim([-1 1])

title('x(nTx)*g(mTy-nTx),n=0,1,2,3')

legend('n=0','n=1','n=2','n=3')

hold off

subplot(312)

grid on

hold on

stem(ty,sum(ytnd(1:2,:)))

stem(xtnd(3,:),ytnd(3,:))

xlim([-1 1])

legend('sum(1:2)','n=2')

title('x(nTx)*g(mTy-nTx),m=0')

hold off

subplot(313)

grid on

hold on

stem(ty,sum(ytnd(1:Fx+1,:)))

plot(tx1,xt1)

xlim([-1 1])

legend('sum')

title('sum(x(nTx)*g(mTy-nTx))')

hold off

3.频率转换公式的进一步变形与探讨

假设Tx=Ty=T,我们就可以将以上公式1简化,得到一个输入信号与线性时不变系统的卷积公式

公式2

如果Tx≠Ty,将公式1整理得到如下形式

公式3

我们可以将mTy/Tx的结果分成整数km与小数△m两部分,即:

公式4

插值样本出现在第km个周期中的△m处,m=0,1,Tx=0.1,Ty=0.15

将公式4带入到公式3中,得到以下形式:

公式5

如果我们定义,公式5可以整理为以下形式

同时,mTy=(km+△m)Tx,因此:

也即:

公式6

综合以上讨论:

1】给定的Tx决定了输入序列的采样率,给定Tx就确定了输入序列的时间坐标;输出的采样率由Ty确定,给定Ty就确定了输出序列的时间坐标

2】讨论观察g(kTx+△mTx)序列后我们能发现,g(kTx+△mTx)是g(kTx)的尺度缩放,而△m的取值可能是有限个的,也就是说在公式6中用到的g(kTx+△mTx)序列只有有限种可能,这样相比较公式1中需要求取每一个n对应的g序列来讲,我们就可以用提前计算所有可能的g(kTx+△mTx)然后再查表的方法来代替原来公式1中每次都需要重新计算序列的方法,达到降低计算量的目的;而x((km-k)Tx)部分则是原公式1中x(nTx),可以通过km与n的对应关系查表获得,无需重复计算。

3】通过以上讨论我们也能发现,对于不同的输入样本点,系统的响应函数是在变化的,所以离散时间信号的速率转换系统一个线性时变系统。

以上就是信号采样率的转换理论基础,上采样与下采样的讨论结合子带滤波器组,后续再开一篇博客继续讨论。

Copyright © 2088 中国举办世界杯_世界杯足球场地尺寸 - lchjdj.com All Rights Reserved.
友情链接