我正在尝试使用MATLAB中的sinc函数在采样频率800e6处重建信号cos(2 * pi * 300e6)。当我输入以下代码时,我会得到一些非常嘈杂的东西 - 而不是我想要的东西。我究竟做错了什么?提前谢谢!
代码:
F1 = 300e6;
Fs = 800e6;
tmin = 0;
tmax = 10/F1;
t = tmin:1e-12:tmax;
x1 = cos(2*pi*F1*t);
Ts = 1/Fs;
ts = tmin:Ts:tmax;
x1resampled = cos(2*pi*F1*ts);
x1reconstructed = zeros(1,length(t)); %preallocating for speed
samples = length(ts);
for i = 1:1:length(t)
for n = 1:1:samples
x1reconstructed(i) = sum(x1resampled(n)*sinc(pi*(t(i)-n*Ts)/Ts));
end
end
figure(1)
subplot(2,1,1)
plot(t,x1)
hold on
stem(ts,x1resampled)
subplot(2,1,2)
plot(t,x1reconstructed)
答案 0 :(得分:4)
代码有两个问题:
您没有正确累积重建的样本。具体来说,您只保留重采样信号中的一个值,而不是所有样本。
sinc
使用规范化的sinc函数。这意味着您不必将参数乘以pi
。回想一下,重构公式需要规范化的sinc函数,因此函数的参数中没有pi
的乘法。
因此,您只需更改for
循环中的代码:
F1 = 300e6;
Fs = 800e6;
tmin = 0;
tmax = 10/F1;
t = tmin:1e-12:tmax;
x1 = cos(2*pi*F1*t);
Ts = 1/Fs;
ts = tmin:Ts:tmax;
x1resampled = cos(2*pi*F1*ts);
x1reconstructed = zeros(1,length(t)); %preallocating for speed
samples = length(ts);
for i = 1:1:length(t)
for n = 1:1:samples
x1reconstructed(i) = x1reconstructed(i) + x1resampled(n)*sinc((t(i)-n*Ts)/Ts); %%% CHANGE
end
end
figure(1)
subplot(2,1,1)
plot(t,x1)
hold on
stem(ts,x1resampled)
subplot(2,1,2)
plot(t,x1reconstructed)
我现在得到这个情节:
为了提高效率,请务必使用sum
函数,但要对所有示例执行此操作。所以你的for
循环现在应该是:
for i = 1:1:length(t)
x1reconstructed(i) = sum(x1resampled .* sinc((t(i) - (1:samples)*Ts) ./ Ts));
end
答案 1 :(得分:4)
使用离散傅立叶变换(DFT)可以完成同样的事情,但效率更高:
F1 = 300e6;
Fs = 800e6;
tmin = 0;
tmax = 10/F1;
t = tmin:1e-12:tmax;
x1 = cos(2*pi*F1*t);
Ts = 1/Fs;
ts = tmin:Ts:tmax;
x1resampled = cos(2*pi*F1*ts);
x1resampledDFT = fftshift(fft(x1resampled));
n = (length(x1)-length(x1resampledDFT))/2;
x1reconstructedDFT = [zeros(1,ceil(n)),x1resampledDFT,zeros(1,floor(n))];
x1reconstructed = ifft(ifftshift(x1reconstructedDFT));
x1reconstructed = x1reconstructed / length(x1resampled) * length(x1reconstructed);
figure(1)
subplot(2,1,1)
plot(t,x1)
hold on
stem(ts,x1resampled)
subplot(2,1,2)
plot(t,x1reconstructed)
这里发生的事情是我将DFT(使用fft
有效地计算)用零填充到所需的大小。然后,逆变换导致使用正弦内插器内插信号。为了保持信号强度,需要进行一些归一化。您对Rayryeng的答案所看到的任何差异都是由于DFT的周期性特征:基本上sinc函数,当它们从右侧退出信号域时,返回到左侧;绘图右端的数据会影响绘图左端的结果,反之亦然。
要了解有关使用傅立叶变换进行插值的更多信息,请参阅this blog post。