空间域中的 Sinc 插值

信息处理 傅里叶变换 插值
2022-02-21 08:29:47

我尝试使用以下 Matlab 代码执行 sinc 插值(一维):

Fs=8;
T=1/Fs;
t=0:T:(1-T);
f=1;
x=sin(2*pi*f*t);

up_factor=2;

%% Deduce sinc from Fourier domain

xp=[zeros(1,5) x zeros(1,5)];

Xp=fft(xp);

door1D=abs(xp>0);
sinc1D=fftshift(abs(fft(door1D)));

%plot(door1D);hold on;plot(fftshift(abs(sinc1D)))



%% Interp with sinc in spatial domain
x_up=upsample(x,2);
%plot(x,'b*');hold on;plot(x_up,'r*');
x_up_interp=conv2(x_up,sinc1D,'same');

figure;
plot(x_up_interp./up_factor);
hold on;
plot(x);
hold on;
plot(x_up,'r+');

它似乎有效(除了我猜的吉布斯现象引起的涟漪?)。但是,我以“演绎”的方式解决了这个问题,我并不完全理解 sinc 的参数(周期/频率)。该方法是从门函数的 fft 中提取 sinc。然后使用该 sinc,就好像我事先计算过它一样,并将上采样(尚未内插)的 1D 信号与它进行卷积。

有人可以帮助我更好地理解它吗?我将如何构建这个 sinc ?例如来自 Matlab 的 sinc() 函数。为了让它发挥作用,我与 sinc cf 的 abs 进行了卷积。conv2(x_up,sinc1D,'same');,但这似乎很奇怪......有人可以解释/开发/纠正这个吗?

REM.:也可能是严重缩放,但这是另一个细节

2个回答

sinc 函数实际上代表了一个理想的(砖墙)低通滤波器,用于在数据正确扩展(零填充)后完成插值过程。所以让我在这里概述时域方法:

假设您有数据样本x[n]长度N,并且您想通过整数因子对它进行上采样L,产生一个新的插值数据y[n]长度M=L×N样品。

第一阶段是零填充输入x[n]; 即,将其扩展L通过扩展块:

x[n]Lxe[n]

在哪里xe[n]x[n]通过以下方式:

xe[n]={x[n/L]   ,   n=0,±L,±2L...   0     ,   otherwise

然后,完成插值过程并填充空(归零)样本xe[n],一个必须低通滤波器xe[n]通过一个理想的低通滤波器h[n]具有以下频域定义H(ω)

H(ω)={ L    ,   |ω|<πL 0    ,   otherwise

脉冲响应h[n]该理想滤波器的离散时间由逆离散时间傅里叶变换H(ω)并且由

h[n]=Lsin(πLn)πn

这是一个无限长且非因果的过滤器,因此无法以这种形式实现。(参见 Hilmar 的评论)实际上它被一个窗口函数截断加权,例如一个 Hamming 或 Kaiser 窗口。

以下 MATLAB / OCTAVE 代码表示设计滤波器并将其应用于时域数据:

L = 5;      % interpolation factor
N = 500;    % data length
 
x = hamming(N)'.*randn(1,N);  % generate bandlimited data...

% expanded signal
xe = zeros(1,N*L);
xe(1:L:end) = x;          % generate th expanded signal 

% interpolation sinc filter
n = -32:32;               % timing index
h = L*sin(pi*n/L)./(pi*n); % ideal lowpass filter
h(33) = L;                % fill in the zero divison sample
h = hamming(65)'.*h;      % apply weighting window on h[n]

% interpolate:
y = filter(h,1,xe);     % y[n] is the interpolated signal

Sinc() 插值在纸上或教科书中看起来不错,但实际上它很少是一个好的解决方案。主要问题是 sinc() 脉冲响应无限长并且不是因果关系。它不仅具有无限长度,而且随着时间的推移衰减非常缓慢,因此您通常需要大量样本才能获得不错的准确度。

这反过来又导致了长延迟、高计算成本和输出开始和结束时相当大的“过渡”区域。