ダウンサンプリングしたデータから元の波形をアップサンプリングによって復元したいということですか?
以下にコードを示しながら説明します。
分かりやすいようにサンプル数nとサンプリング時間間隔dtを変更しています。
%初期設定
n = 64; % サンプル数
dt = 0.001; % サンプリング時間間隔
t = ((1:n)-1)*dt; % 時間配列
fs = 1/dt; % サンプリング周波数
%関数
a = sin(2*pi*5*t);
b = sin(2*pi*50*t);
c = sin(2*pi*80*t);
d = a + b + c;
%ダウンサンプリング
dds = downsample(d,2);
tds = downsample(t,2); % ダウンサンプリングしたddsに対応する時間配列
% ダウンサンプリングできているか確認
figure(1)
plot(t,d,'-ob'); % 元のデータを青線と青〇で表示
hold on
plot(tds,dds,'or'); % ダウンサンプリングしたデータを赤〇で表示
legend('original','downsampling')
青い線とマーカーはダウンサンプリングする前のデータです。
赤い丸は2点毎にダウンサンプリングしたデータです。ちゃんと2点毎になっていることが確認できます。
次に赤い点のデータtdsとddsからアップサンプリングする場合を考えてみましょう。
つまり上の図で赤い点のデータしかない時に、青い点をspline補間によって求める、という場合です。
まず、補間したい時間配列(クエリ点)を用意します。例えばダウンサンプリングする前の元の時間配列でもいいですし、もっと細かくてもいいです。
ここでは元の時間配列をアップサンプリング時間配列とします。
%アップサンプリング時間配列(元の時間配列ですから、これはtdsの2倍のサンプリング数です)
tus = t;
次にtusに対応する値をスプライン補間によって求めます。
splineの説明を参照するとこのように書かれています。
つまり今回の場合、x,yがダウンサンプリングしたデータ(疎なデータ)tds,ddsに対応し、xqがアップサンプリングしたいクエリ点(xよりも細かい)tusに対応します。
したがってこのように記述します。
upsdata = spline(tds,dds,tus);
tdsとddsからスプライン補間することによって、tusに対応する値がupsdataに格納されますから、tusとupsdataの要素数は同じです。
図を出力すると確かにアップサンプリングできていることが確認できます。
figure(2)
plot(tus,upsdata,'-og'); % spline補間によって求めた値
hold on
plot(tds,dds,'or'); % 補間前のデータ
legend('upsampling','downsampling');