필터 지우기
필터 지우기

三次元スプライン補間の詳細について

조회 수: 12 (최근 30일)
Masaya Kikuzawa
Masaya Kikuzawa 2020년 4월 7일
답변: Takumi 2020년 4월 8일
ある関数をダウンサンプリングさせた後、3次スプライン補間にてアップサンプリングをしたいのですがクエリの値をどのようにすればよいのか教えていただいてもよろしいでしょうか
以下が作りたいコードです
%初期設定
n = 4096;
dt = 0.005;
t = ((1:n)-1)*dt;
f = t/dt/dt/n;
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);
%これで半分にダウンサンプリングされているはず
%アップサンプリング
downt = ((1:(n/2))-1)*dt;%tの半分の長さ
upsdata = spline(???)
upsdata = spline(???)
の???の部分をどうすれば良いのか迷っています
一応
upsdata = spline(t,d,t)
とすればいい感じの波形が帰ってくるのですがこれってアップサンプリングじゃないですよね
どなたかお願いします

답변 (1개)

Takumi
Takumi 2020년 4월 8일
ダウンサンプリングしたデータから元の波形をアップサンプリングによって復元したいということですか?
以下にコードを示しながら説明します。
分かりやすいようにサンプル数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の説明を参照するとこのように書かれています。
s = spline(x,y,xq) は、xq のクエリ点に対応する内挿値のベクトル s を返します。s の値は x と y の 3 次スプライン内挿により決定されます。
つまり今回の場合、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');

카테고리

Help CenterFile Exchange에서 内挿에 대해 자세히 알아보기

제품


릴리스

R2020a

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!