1. 程式人生 > >【 MATLAB 】MATLAB 實現模擬訊號取樣後的重建(三)應用三次樣條函式spline實現內插

【 MATLAB 】MATLAB 實現模擬訊號取樣後的重建(三)應用三次樣條函式spline實現內插

前三篇博文講了三種方法進行內插重建訊號:

這篇文章使用三次樣條函式spline來實現內插重建,並分析重建誤差。

採用的案例依然是上篇博文中的案例:

模擬訊號:

x_a(t) = e^{-1000\left |t \right |}

對該訊號使用兩種不同的取樣頻率取樣。

a. 在 fs = 5000 對訊號進行取樣

b. 在 fs = 1000 對訊號取樣

前面太多的文章作為鋪墊,這裡直接給出MATLAB指令碼:

clc
clear
close all
 
% Analog signal
Dt = 0.00005;
t = - 0.005:Dt:0.005;
xa = exp(-1000 * abs(t));

subplot(3,1,1);
plot(1000*t,xa);
title('Analog signal');
xlabel('t in msec');
ylabel('xa');
 
%Fs = 5000,Ts = 0.0002
% Discrete-time signal
Ts = 0.0002;
Fs = 1/Ts;
n = -25:25;
nTs = n*Ts;
x = exp(-1000*abs(nTs));

subplot(3,1,2)
plot(1000*t,xa);
hold on
stem(n*Ts*1000,x);
title('Discrete-time signal');
hold off

% Analog signal reconstruction
subplot(3,1,3);
xa_r = spline(nTs,x,t);
plot(t*1000,xa_r);
title('Analog signal reconstruction');
xlabel('t in msec');
ylabel('xa after reconstruction');
hold on 
stem(n*Ts*1000,x)
hold off


error1 = max(abs(xa_r - xa))

% Fs = 1000, Ts = 1ms
% Discrete-time signal
Ts = 0.001;
Fs = 1/Ts;
n = -5:5;
nTs = n*Ts;
x = exp(-1000*abs(nTs));

figure 

subplot(3,1,1);
plot(1000*t,xa);
title('Analog signal');
xlabel('t in msec');
ylabel('xa');

subplot(3,1,2)
plot(1000*t,xa);
hold on
stem(n*Ts*1000,x);
title('Discrete-time signal');
hold off

% Analog signal reconstruction
subplot(3,1,3);
xa_r = spline(nTs,x,t);
plot(1000*t,xa_r);
title('Analog signal reconstruction');
xlabel('t in msec');
ylabel('xa after reconstruction');
hold on 
stem(n*Ts*1000,x)
hold off

error2 = max(abs(xa_r - xa))


當取樣率Fs為5000 樣本/s時,重建結果:

誤差:

error1 =

    0.0317

重建和真正的模擬訊號之間的誤差是0.0317,這是由於非理想內插和非帶限造成的。將這個誤差與sinc函式內插比較(理想),這個誤差還比較小。從重構圖上看,重建還是不錯的。

當取樣率Fs為1000樣本/s時,重構結果:

error2 =

    0.1679

這個情況下誤差較大,這是由於取樣間隔過大,也就是取樣率過低造成的頻譜混疊造成的,不能恢復原始訊號了。