How to reconstruct/resample signal into continuous signal
7 次查看(过去 30 天)
显示 更早的评论
t_cont = 0:0.001:0.5;
t_a = 0:1/48:0.5;
x_cont = 5 * cos(12*2*pi*t_cont) - 2*sin(2*pi*3/4*t_cont); %f_ny = 24Hz
x_a = 5 * cos(12*2*pi*t_a) - 2*sin(2*pi*3/4*t_a); %has at least Nyquist sampling frequency
y_a = resample(x_a, size(t_cont, 2), size(t_a, 2));
assert(y_a == t_cont) %this fails
From the signal theory, we know that if a signal is sampled with "Nyquist frequency" or higher, it should be reconstructable to the original signal.
0 个评论
回答(1 个)
Umeshraja
2024-10-10
编辑:Umeshraja
2024-10-10
The process of reconstruction is indeed more complex than a simple resampling operation. It is true that a signal sampled at or above the Nyquist frequency can theoretically be reconstructed,
The “resample” function in MATLAB is primarily used for changing the sampling rate of discrete signals, which doesn't necessarily produce an ideal reconstruction. For proper reconstruction, we need to use ideal interpolation, typically approximated by sinc interpolation.
Here's a modified approach that demonstrates reconstruction using both a simple loop and a vectorized method. The vectorized method is typically much faster, especially for larger signals,
t_cont = 0:0.001:0.5;
t_a = 0:1/48:0.5;
Fs = 48;
% Sampling frequency is indeed above
% the Nyquist rate for the highest frequency component (12 Hz),
% allowing for accurate reconstruction.
f1 = 12; % Hz
f2 = 3/4; % Hz
% Original continuous signal
x_cont = 5 * cos(2*pi*f1*t_cont) - 2*sin(2*pi*f2*t_cont);
% Sampled signal
x_a = 5 * cos(2*pi*f1*t_a) - 2*sin(2*pi*f2*t_a);
% Reconstruction using sinc interpolation (loop method)
y_reconstructed_loop = zeros(size(t_cont));
for i = 1:length(t_cont)
y_reconstructed_loop(i) = sum(x_a .* sinc(Fs * (t_cont(i) - t_a)));
end
% Reconstruction using sinc interpolation (vectorized method)
n = 0:length(t_a)-1; % Sample indices
nTs = n / Fs; % Sample times
y_reconstructed_vec = x_a * sinc(Fs * (ones(length(n),1)*t_cont - nTs'*ones(1,length(t_cont))));
% Plot results
figure;
plot(t_cont, x_cont, 'b-', 'LineWidth', 1.5);
hold on;
plot(t_a, x_a, 'ro', 'MarkerSize', 6);
plot(t_cont, y_reconstructed_loop, 'g--', 'LineWidth', 1.5);
plot(t_cont, y_reconstructed_vec, 'm:', 'LineWidth', 1.5);
legend('Original Continuous', 'Sampled Points', 'Reconstructed (Loop)', 'Reconstructed (Vectorized)');
xlabel('Time (s)');
ylabel('Amplitude');
% Check reconstruction errors
max_error_loop = max(abs(x_cont - y_reconstructed_loop));
max_error_vec = max(abs(x_cont - y_reconstructed_vec));
fprintf('Maximum reconstruction error (loop method): %.6f\n', max_error_loop);
fprintf('Maximum reconstruction error (vectorized method): %.6f\n', max_error_vec);
% Check if both methods produce the same result
max_diff = max(abs(y_reconstructed_loop - y_reconstructed_vec));
fprintf('Maximum difference between loop and vectorized methods: %.6e\n', max_diff);
Perfect reconstruction is a theoretical concept. In practice, we can get very close, but there will always be small errors due to numerical limitations.
For a deeper dive into sampling theory, I recommend referring to Chapter 4: "Sampling of Continuous-Time Signals" in the book “Digital Signal Processing” by Oppenheim, Alan V., and Ronald W. Schafer.
To know more about “sinc” function, Please refer to the following documentation https://www.mathworks.com/help/signal/ref/sinc.html
0 个评论
另请参阅
类别
在 Help Center 和 File Exchange 中查找有关 Signal Generation and Preprocessing 的更多信息
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!