实验5 时域采样与频域采样

实验目的

  1. 理解时域采样理论与频域采样理论;

  2. 掌握模拟信号采样前后频谱的变化,以及如何选择采样频率才能使采样后的信号不丢失信息;

  3. 掌握频率域采样会引起时域周期化的原因,频率域采样定理及其对频域采样点数选择的指导作用;

  4. 对信号在某个表示域进行采样,会导致在另一个域周期化,科学的结论是建立在对问题的仔细分析和实事求是的基础上得到的。

实验原理

时域采样定理要点

对模拟信号进行时域等间隔采样,形成的采样信号的频谱是原模拟信号频谱 以采样角频率为周期进行周期延拓。公式为:

采样频率必须大于等于模拟信号最高频率的两倍以上,才能使采样信号的频谱不产生频谱混叠。但是利用计算机计算上式并不方便,下面导出另一个公式,以便计算机上进行实验。

理想采样信号 和模拟信号 之间的关系如下:

对式进行傅里叶变换,得到:

在式的积分项中,只有当 时,才有非零值,因此:

频域采样定理要点

对信号 的频谱函数 上等间隔采样点,得到:

点DFT 得到的序列就是原序列为周期进行周期延拓的主值序列,公式为:

由于已知,频域采样点数必须大于等于与时域采样信号的长度(即)才能避免频谱混叠。则用计算机计算DFT 得到的序列就是原序列,如果,则频谱序列呈现更多零元素;如果,则信号在频域上出现混叠,而且的长度也比的长度短,因此 不相同。

在数字信号处理应用中,只需要在有效区域进行频域采样即可。

实验内容以及结果

时域采样理论的验证

【实例3-1】近似绘制x (n) = R4n = 在(0,2 ) 上的幅频响应曲线( )。

1
2
3
4
5
6
7
8
9
10
11
x = [1, 1, 1, 1];
N = 64;
xk = fft(x, N);
figure;
subplot(2, 1, 1);
stem(0:3, x, '.');
subplot(2, 1, 2);
k = 0:N-1;
plot(2*k/N, abs(xk));
title('|FT(x[n])|');
xlabel('\omega/\pi');

编写实验程序,计算 x1(n) 、x2(n) 和 x3(n) 的幅度特性,并绘图显示。观察分析频谱混叠失真。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
% 参数定义
A = 444.128;
alpha = 50 * sqrt(2) * pi;
Omega_0 = 50 * sqrt(2) * pi;
Fs_values = [1000, 300, 200]; % 采样频率:1kHz, 300Hz, 200Hz
T_p = 64e-3; % 采样周期
t = 0:T_p:1; % 时间区间
x_t = A * exp(-alpha * t) .* sin(Omega_0 * t) .* (t >= 0); % 原信号
figure;
% 计算各个采样信号并计算FFT
for i = 1:length(Fs_values)
Fs = Fs_values(i); % 当前采样频率
T = 1 / Fs; % s
N = ceil(T_p * Fs); % 计算变换点数并确保是整数
N = 2^nextpow2(N); % 确保 N 是 2 的幂,方便 FFT 计算

n = 0:floor(N)-1; % 离散时间序列

% 生成采样信号
xn = A .* exp(-alpha * n * T) .* sin(Omega_0 * n * T);

% 计算FFT
Xk = fft(xn, N); % 计算频域信号
f = (0:N-1) * Fs / N; % 频率轴

% 绘图
subplot(3,2,2*i-1);
stem(n,xn,'.');
axis auto
title(['Fs = ', num2str(Fs), ' Hz']);
subplot(3,2,2*i);
plot(f, abs(Xk)*T);
axis 'auto x'
title(['T*|FT(x',num2str(i),'[n])|',',Fs = ', num2str(Fs), ' Hz']);
xlabel('频率 (Hz)');
ylabel('幅度');
end

频域采样理论的验证

【实例3-2】抽取信号x (k )= {1, 2, 3, 4, 4, 3, 2,1} 信号中的k 为偶数的信号点出来。

1
2
3
x1=[1 2 3 4 4 3 2 1];
N=1:2:7;
x2=x1(N)
1
2
3
x2 = 1x4    
1 3 4 2

给定信号如下:

编写程序分别对频谱函数 在区间 上等间隔采样32和16点,得到

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
% 定义信号 x(n)
n = 0:31;
x = zeros(1, length(n));
x(1:14) = n(1:14) + 1; % 0 <= n <= 13
x(15:27) = 27 - n(15:27); % 14 <= n <= 26

xn = x;
% 计算32点和16点FFT
Xk = fft(x, 1024);
N32 = 1:32:1024;% xk抽样得到32个点
Xk32 = Xk(N32);
N16=1:64:1024;% xk抽样得到16个点
Xk16 = Xk(N16);

% 计算32点和16点IFFT
xn32 = ifft(Xk32, 32);
xn16 = ifft(Xk16, 16);
% Xejw
figure;
subplot(3, 2, 1);
plot(linspace(0, 1, 256), abs(Xk(1:256)));
xlabel('ω/π');
ylabel('|X(e^{jω})|');
title('(a)FT[x(n)]');

subplot(3, 2, 2);
stem(n,xn,'.');
xlabel('n');
ylabel('x(n)');
title('(b)三角波序列');

% Xk16
subplot(3, 2, 3);
stem(0:15, abs(Xk16),'.');
xlabel('k');
ylabel('|X_{16}(k)|');
title('(c)16点频域采样');

subplot(3, 2, 4);
stem(0:15,xn16,'.');
axis([0 32 0 15])
xlabel('n');
ylabel('x(n)');
title('(d)16点IDFT[X_{16}(k)]');

% Xk32
subplot(3, 2, 5);
stem(0:31, abs(Xk32),'.');
xlabel('k');
ylabel('|X_{32}(k)|');
title('(e)32点频域采样');

subplot(3, 2, 6);
stem(n,xn32,'.');
xlabel('n');
ylabel('x(n)');
title('(f)32点IDFT[X_{32}(k)]');

语音信号整数倍抽取后的频谱的分析

读取motherland.wav 语音文件,截取第1000 至2999 共2000 个采样点。

(1)分析这2000 采样点的幅度频谱(采用实验四的代码);

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
close;clear;
% 读取音频文件
[audio,fs] = audioread(...
".\2024-2025(1)《信号处理实验》资料(请拷贝到u盘中,每次试验带到实验室)\实验中用到的一些函数和音频图像文件\motherland.wav"...
);

% 截取1~2秒的音频数据
audioSegment = audio(1000:2999, :);

N=1024;
t = (0:1999)/fs;
xk=fft(audioSegment,N);

f = linspace(0, fs, N);
% 绘制幅度谱
figure;
subplot(2,1,1);
plot(t, audioSegment);
title('原信号时域波形');
xlabel('t(s)');
ylabel('');
subplot(2,1,2);
plot(f, abs(xk));
title('原信号幅度谱');
xlabel('f(Hz) ');
ylabel('幅度');

(2)对这2000 采样点数据,每2 个点抽取1 点,得到1000 点数据,画出这1000 个采样点的幅度频谱。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
n=1:2:1999;
% 每2个点抽取1点
sample=audioSegment(n);

%抽样信号fft
xk1=fft(sample,N);
f = linspace(0, fs/2, N);

figure;
subplot(2,1,1);
plot(1:1000, sample);
title('抽样信号时域波形');
xlabel('t(s)');
ylabel('');
subplot(2,1,2);
plot(f, abs(xk1));
title('抽样信号幅度谱');
xlabel('f(Hz)');
ylabel('幅度');

思考题

1. 如果序列x(n)的长度为M,希望得到其频谱 上的N 点等间隔采样,当N<M 时,如何用一次最少点数的DFT 得到该频谱采样?

n<m时,频域抽样不够密,(x)n以周期进行延拓,频域产生混叠,抽样信号不能还原原信号。

可将m分为n长度的k段,不足时域补零。分段进行DFT。此时DFT点数最少为N次。

2. 对采样后的语音信号,每2 个样点抽取1 点,语音信号会发生频谱混叠吗?

如果发生会发生频谱混叠,原因是什么?以实验内容3.3 为例进行说明。

当每2 个样点抽取1 点时,相当于对信号进行了降采样,即将采样率降低为原来的一半。如果在降采样之前没有适当的低通滤波器来滤除高于新采样率一半的频率分量,根据奈奎斯特采样定理,信号中高频成分就会折叠到低频部分,导致频谱混叠。

在本题中,信号的中高频成分分量较少,观察不到混叠现象。