MATLAB - 插值



插值是數學和計算機科學中使用的一種方法,用於估計已知資料點之間未知的值。它通常用於各個領域,包括訊號處理、計算機圖形學和數值分析,以建立平滑的曲線或曲面來近似資料。

在 MATLAB 中,插值是使用諸如 **interp1()**(用於一維插值)和 **interp2()**(用於二維插值)之類的函式實現的。這些函式採用已知資料點(x 和 y 座標)以及需要進行插值的一組點。可以指定插值方法,例如線性插值('linear')、樣條插值('spline')或最近鄰插值('nearest')。所選方法決定了在已知資料點之間如何構建曲線或曲面。

透過使用插值,您可以填充缺失資料,建立更平滑的資料表示,併為視覺化或分析生成新的資料點。MATLAB 的插值函式為處理未定期取樣資料或從離散資料點生成插值曲面提供了強大的工具。

語法

y = interp(x,r)
y = interp(x,r,n,cutoff)
[y,b] = interp(x,r,n,cutoff)

上面提到的語法的解釋如下:

**y = interp(x,r)** - 獲取訊號 x 並將其取樣率提高 r 倍。

**y = interp(x,r,n,cutoff)** - 這裡我們有兩個新增內容,即 n 和 cutoff。n 是用於插值擴充套件訊號的原始樣本值數量的一半。

cutoff 是輸入訊號的歸一化截止頻率,指定為奈奎斯特頻率的一部分。

**[y,b] = interp(x,r,n,cutoff)** - 返回用於插值的濾波器係數。

示例 1:使用 y = interp(x,r)

我們擁有的程式碼為:

x = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
r = 2;
y = interp(x, r);
subplot(2, 1, 1);
stem(x, 'b', 'DisplayName', 'Original Signal');
xlabel('Sample');
ylabel('Value');
title('Original and Interpolated Signals');
legend('show');
subplot(2, 1, 2);
stem(y, 'r', 'DisplayName', 'Interpolated Signal');
xlabel('Sample');
ylabel('Value');
legend('show');

此程式碼建立一個帶有兩個圖的子圖:一個用於原始訊號 (x),另一個用於插值訊號 (y)。stem 函式用於將訊號繪製為莖狀圖,其中每個資料點都表示為一條垂直線。subplot(2, 1, 1) 命令將繪圖區域劃分為兩行一列,併為原始訊號選擇第一個子圖。subplot(2, 1, 2) 命令為插值訊號選擇第二個子圖。

interpolated signal

示例 2:使用其他引數(如 n 和 cutoff)對訊號進行插值

我們擁有的程式碼為:

n = 5;
x = 1:20;
r = 2;
cutoff = 0.5;
y = interp(x, r, n, cutoff);
subplot(2, 1, 1);
stem(x, 'b', 'DisplayName', 'Original Signal');
xlabel('Sample');
ylabel('Value');
title('Original and Interpolated Signals');
legend('show');

subplot(2, 1, 2);
stem(y, 'r', 'DisplayName', 'Interpolated Signal');
xlabel('Sample');
ylabel('Value');
legend('show');

在上面的示例中:

  • 濾波器長度 n 設定為 5,它確定用於插值的濾波器的長度。它是用於插值擴充套件訊號的原始樣本值數量的一半。原始訊號 x 定義為 1:20,它建立一個從 1 到 20 的整數向量。
  • 取樣率提高了 2 倍,由 r = 2 指定。歸一化截止頻率 cutoff 設定為 0.5,它是奈奎斯特頻率的一部分。它確定濾波器衰減到一半功率的頻率。
  • interp() 函式用於使用指定引數 (r、n、cutoff) 對原始訊號 x 進行插值。插值過程提高了原始訊號的取樣率,從而產生新的插值訊號 y。
  • 使用 subplot() 函式建立兩個子圖以顯示原始訊號和插值訊號。stem() 函式用於將訊號繪製為莖狀圖,其中每個資料點都表示為一條垂直線。第一個子圖以藍色顯示原始訊號 (x),第二個子圖以紅色顯示插值訊號 (y)。x 軸表示樣本編號,y 軸表示訊號值。

當代碼在 matlab 命令視窗中執行時,輸出為:

Signal additional parameters

示例 3:使用 [y,b] = interp(x,r,n,cutoff) 顯示濾波器係數

我們擁有的程式碼為:

x = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12];
r = 2;
n = 5;
cutoff = 0.5;
[y, b] = interp(x, r, n, cutoff);

% Plot the original and interpolated signals
subplot(2, 1, 1);
stem(x, 'b', 'DisplayName', 'Original Signal');
xlabel('Sample');
ylabel('Value');
title('Original and Interpolated Signals');
legend('show');

subplot(2, 1, 2);
stem(y, 'r', 'DisplayName', 'Interpolated Signal');
xlabel('Sample');
ylabel('Value');
legend('show');

% Display the filter coefficients
disp('Filter Coefficients:');
disp(b);

在此示例中,interp() 函式用於使用指定引數 (r、n、cutoff) 對原始訊號 x 進行插值。獲得插值訊號 y,並且還返回用於插值的濾波器係數 b。在示例的末尾使用 disp(b) 顯示濾波器係數。

當代碼執行時,輸出如下:

Filter Coefficients:
    0.0000
    0.0020
   -0.0000
   -0.0135
    0.0000
    0.0511
   -0.0000
   -0.1546
    0.0000
    0.6150
    1.0000
    0.6150
    0.0000
   -0.1546
   -0.0000
    0.0511
    0.0000
   -0.0135
   -0.0000
    0.0020
    0.0000
filter coefficients

對網格資料進行插值

處理網格資料時,插值通常用於估計網格點之間的值。MATLAB 提供了多個用於插值網格資料的函式,例如 interp2(用於二維資料)和 interp3(用於三維資料)。這些函式可用於建立更平滑的資料表示或提取網格內特定點的值。

示例 1:使用 interp2 對二維網格資料進行插值

我們擁有的程式碼為:

[x, y] = meshgrid(-2:0.5:2, -2:0.5:2);

% Define the function z = f(x, y) = x^2 + y^2
z = x.^2 + y.^2;

% Create a finer grid for interpolation
[xq, yq] = meshgrid(-2:0.1:2, -2:0.1:2);

% Perform 2D interpolation
zq = interp2(x, y, z, xq, yq, 'cubic');

% Plot the original and interpolated data
figure;
surf(x, y, z);
hold on;
surf(xq, yq, zq);
legend('Original Data', 'Interpolated Data');
xlabel('X');
ylabel('Y');
zlabel('Z');
title('2D Interpolation of Gridded Data');

在此示例中,我們首先使用 meshgrid 建立 x 和 y 值的網格。然後,我們定義一個函式 z = f(x, y) = x^2 + y^2 並計算網格上相應的 z 值。接下來,我們使用 meshgrid 再次建立一個用於插值的更精細的網格。最後,我們使用 interp2 和三次方法對新網格點 xq 和 yq 處的 z 值進行插值。然後將插值資料與原始資料一起繪製以進行比較。

執行後,輸出為:

2d gridded data

示例 2:使用 interp3 對三維網格資料進行插值

我們擁有的程式碼為:

[x, y, z] = meshgrid(-2:0.5:2, -2:0.5:2, -2:0.5:2);


w = x.^2 + y.^2 + z.^2;

% Create a finer grid for interpolation
[xq, yq, zq] = meshgrid(-2:0.1:2, -2:0.1:2, -2:0.1:2);

% Perform 3D interpolation
wq = interp3(x, y, z, w, xq, yq, zq, 'cubic');

% Plot the original and interpolated data
figure;
slice(x, y, z, w, [0], [0], [0]); % plot slices of the original data
hold on;
slice(xq, yq, zq, wq, [0], [0], [0]); % plot slices of the interpolated data
xlabel('X');
ylabel('Y');
zlabel('Z');
title('3D Interpolation of Gridded Data');
legend('Original Data', 'Interpolated Data');

在此示例中,我們首先使用 meshgrid 建立 x、y 和 z 值的網格。然後,我們定義一個函式 w = f(x, y, z) = x^2 + y^2 + z^2 並計算網格上相應的 w 值。接下來,我們使用 meshgrid 再次建立一個用於插值的更精細的網格。最後,我們使用 interp3 和三次方法對新網格點 xq、yq 和 zq 處的 w 值進行插值。然後將插值資料與原始資料一起繪製以進行比較。

執行後,我們有:

3d gridded data

對離散資料進行插值

MATLAB 中的散點資料是指未按規則網格排列的一組資料點。這種型別的資料在許多科學和工程應用中很常見,在這些應用中,測量是在任意位置進行的。散點資料插值涉及估計這些點之間的值,以建立平滑的表面或函式。

在 MATLAB 中,griddata 函式通常用於插值散點資料。它使用各種插值方法,例如線性、最近鄰、三次和樣條,來估計資料集中未明確給出的點的值。

示例

我們擁有的程式碼為:

x = rand(100,1)*4 - 2;
y = rand(100,1)*4 - 2;
z = peaks(x,y);

% Define a regular grid for interpolation
[Xq,Yq] = meshgrid(-2:0.1:2, -2:0.1:2);

% Interpolate scattered data to the regular grid using griddata
Zq = griddata(x,y,z,Xq,Yq,'cubic');

% Plot the scattered data and the interpolated surface
figure;
scatter3(x, y, z, 'filled'); % Plot scattered data points
hold on;
surf(Xq, Yq, Zq); % Plot interpolated surface
hold off;
xlabel('X');
ylabel('Y');
zlabel('Z');
title('Interpolating Scattered Data');
legend('Scattered Data', 'Interpolated Surface');

在示例中 -

  • 我們生成隨機散點資料點 (x, y) 並使用 peaks 函式計算相應的 z 值。
  • 我們使用 meshgrid 在與散點資料相同的範圍內定義規則網格 (Xq, Yq)。
  • 我們使用 griddata 將散點資料插值到規則網格上。插值使用 'cubic' 方法,但您也可以使用 'linear'、'nearest' 或其他方法。
  • 最後,我們繪製散點資料點和插值表面以視覺化插值。

執行後的輸出為 -

interpolating scattered data
廣告