MATLAB实现时域采样与频域采样
MATLAB实现时域采样与频域采样
本文介绍了如何使用MATLAB实现时域采样与频域采样,并通过绘制不同采样频率下的信号波形和频谱图,验证了采样定理。
1. 时域采样
时域采样是指以一定的频率对连续时间信号进行采样,得到离散时间信号的过程。采样频率必须大于等于信号最高频率的两倍,才能保证信号的信息不丢失,这就是著名的奈奎斯特采样定理。
以下代码演示了如何使用MATLAB对一个衰减正弦信号进行不同采样频率的采样,并绘制出相应的时域波形和频谱图:
Tp = 64 / 1000; % 观察时间 Tp = 64 微秒
% Fs = 1000; T = 1 / Fs;
Fs = 1000;
T = 1 / Fs;
% 产生 M 长采样序列 x(n)
M = round(Tp * Fs); % 修正采样点数为最接近的整数
n = 0:M-1;
A = 444.128;
alph = pi * 50 * 2^0.5;
omega = pi * 50 * 2^0.5;
xnt = A * exp(-alph * n * T) .* sin(omega * n * T);
Xk = T * fft(xnt, M); % M 点 FFT[(xnt)]
yn = 'xa(nT)';
figure('Name', 'Fs = 1000Hz');
subplot(3, 2, 1);
tstem(xnt, yn);
box on;
title('Fs = 1000Hz');
k = 0:M-1;
fk = k / Tp;
subplot(3, 2, 2);
plot(fk, abs(Xk));
title('T*FT[xa(nT)], Fs = 1000Hz');
xlabel('f(Hz)');
ylabel('Amplitude');
axis([0, Fs, 0, 1.2 * max(abs(Xk))]);
% Fs = 300Hz 的情况
Fs = 300;
T = 1 / Fs;
M = round(Tp * Fs); % 修正采样点数为最接近的整数
n = 0:M-1;
xnt = A * exp(-alph * n * T) .* sin(omega * n * T);
Xk = T * fft(xnt, M); % M 点 FFT[(xnt)]
yn = 'xa(nT)';
figure('Name', 'Fs = 300Hz');
subplot(3, 2, 1);
tstem(xnt, yn);
box on;
title('Fs = 300Hz');
k = 0:M-1;
fk = k / Tp;
subplot(3, 2, 2);
plot(fk, abs(Xk));
title('T*FT[xa(nT)], Fs = 300Hz');
xlabel('f(Hz)');
ylabel('Amplitude');
axis([0, Fs, 0, 1.2 * max(abs(Xk))]);
% Fs = 200Hz 的情况
Fs = 200;
T = 1 / Fs;
M = round(Tp * Fs); % 修正采样点数为最接近的整数
n = 0:M-1;
xnt = A * exp(-alph * n * T) .* sin(omega * n * T);
Xk = T * fft(xnt, M); % M 点 FFT[(xnt)]
yn = 'xa(nT)';
figure('Name', 'Fs = 200Hz');
subplot(3, 2, 1);
tstem(xnt, yn);
box on;
title('Fs = 200Hz');
k = 0:M-1;
fk = k / Tp;
subplot(3, 2, 2);
plot(fk, abs(Xk));
title('T*FT[xa(nT)], Fs = 200Hz');
xlabel('f(Hz)');
ylabel('Amplitude');
axis([0, Fs, 0, 1.2 * max(abs(Xk))]);
2. 频域采样
频域采样是指对信号的频谱进行采样,得到离散频率的频谱。频域采样的点数决定了时域信号的长度,即频域采样点数越多,时域信号长度越长。
以下代码演示了如何使用MATLAB对一个三角波信号进行频域采样,并验证了频域采样定理:
%=========2 频域采样理论的验证程序清单=========
M = 27;
N = 32;
n = 0:M;
% 产生 M 长三角波序列 x(n)
xa = 0:floor(M/2);
xb = ceil(M/2)-1:-1:0;
xn = [xa, xb];
Xk = fft(xn, 1024); % 1024 点 FFT[x(n)],用于近似序列 x(n) 的 TF
X32k = fft(xn, 32); % 32 点 FFT[x(n)]
x32n = ifft(X32k); % 32 点 IFFT[X32(k)] 得到 x32(n)
X16k = X32k(1:2:N); % 隔点抽取 X32k 得到 X16(K)
x16n = ifft(X16k, N/2); % 16 点 IFFT[X16(k)] 得到 x16(n)
figure('Name', '2 频域采样理论的验证');
subplot(3, 2, 1);
tstem(xn, 'x(n)');
title('三角波序列 x(n)');
k = 0:1023;
wk = 2 * k / 1024;
subplot(3, 2, 2);
plot(wk, abs(Xk));
title('FT[x(n)]');
xlabel('\omega / \pi');
ylabel('|X(e^{j\omega})|');
k = 0:N/2-1;
subplot(3, 2, 3);
tstem(abs(X16k), '|X_{16}(k)|');
title('16 点频域采样');
xlabel('k');
ylabel('|X_{16}(k)|');
subplot(3, 2, 4);
tstem(x16n, 'x_{16}(n)');
title('16 点 IDFT[X_{16}(k)]');
xlabel('n');
ylabel('x_{16}(n)');
k = 0:N-1;
subplot(3, 2, 5);
tstem(abs(X32k), '|X_{32}(k)|');
title('32 点频域采样');
xlabel('k');
ylabel('|X_{32}(k)|');
subplot(3, 2, 6);
tstem(x32n, 'x_{32}(n)');
title('32 点 IDFT[X_{32}(k)]');
xlabel('n');
ylabel('x_{32}(n)');
通过以上代码,我们可以清晰地看到不同采样频率和采样点数对信号的影响,并验证了采样定理。
原文地址: https://www.cveoy.top/t/topic/5V6 著作权归作者所有。请勿转载和采集!