二 正弦信号频谱分析实验
2.1 单音正弦信号采样序列的时域绘图
绘制下列信号的时域图
信号采样率fs=8000Hz
信号采样序列长度N=32
配置参数
f1=1000; Amp1=1; phy1=0
f2=7000; Amp2=1; phy2=0
f3=9000; Amp3=1; phy3=0
2.1.1 matlab程序
主程序,包括参数设置lab1.m
% lab1
close all;
clear;
fig_fname = 'sine_1_tone.jpg';
fs = 8E3; % 采样率 8k
N = 32; %向量长度
% frequency & amp & initial phase
f1 = 1000; Amp1 = 1; phy1 = 0;
f2 = 7000; Amp2 = 1; phy2 = 0;
f3 = 9000; Amp3 = 1; phy3 = 0;
% 信号向量的下标索引
n_idx = [0 : N-1];
% generate signal
x1 = Amp1 * sin( 2*pi*f1/fs*n_idx + phy1);
x2 = Amp2 * sin( 2*pi*f2/fs*n_idx + phy2);
x3 = Amp3 * sin( 2*pi*f3/fs*n_idx + phy3);
% 生成绘图的标题文字
str_fs = num2str(fs); str_N = num2str(N);
str_f1 = num2str(f1); str_Amp1 = num2str(Amp1); str_phy1 = num2str(phy1);
str_f2 = num2str(f2); str_Amp2 = num2str(Amp2); str_phy2 = num2str(phy2);
str_f3 = num2str(f3); str_Amp3 = num2str(Amp3); str_phy3 = num2str(phy3);
% 合成绘图的标题文字
title_str1 = ['f1:', str_f1, 'Hz, ','fs:', str_fs, 'Hz, ','N:', str_N, ', Amp1:' str_Amp1, ', phy1:',str_phy1];
title_str2 = ['f2:', str_f2, 'Hz, ','fs:', str_fs, 'Hz, ','N:', str_N, ', Amp2:' str_Amp2, ', phy2:',str_phy2];
title_str3 = ['f3:', str_f3, 'Hz, ','fs:', str_fs, 'Hz, ','N:', str_N, ', Amp2:' str_Amp3, ', phy2:',str_phy3];
%绘图
h = figure;
subplot(3,1,1);
plot(n_idx, x1, 'color', 'blue'); %连线方式绘图
grid on; hold;
stem(n_idx, x1, 'color', 'red'); %离散样值方式绘图
title(title_str1, 'fontsize', 14);
subplot(3,1,2);
plot(n_idx, x2, 'color', 'blue'); %连线方式绘图
grid on; hold;
stem(n_idx, x2, 'color', 'red'); %离散样值方式绘图
title(title_str2, 'fontsize', 14);
subplot(3,1,3);
plot(n_idx, x3, 'color', 'blue'); %连线方式绘图
grid on; hold;
stem(n_idx, x3, 'color', 'red'); %离散样值方式绘图
title(title_str3, 'fontsize', 14);
2.1.2 三种信号时域图
图2. 1 1K、7K、9KHz信号时域图
2.1.3 实验结果分析
根据采样定理,信号的频率为f0,采样频率fs,当fs>2f0时,可将信号完全重构。本实验中三种频率的单音信号1kHz、7kHz和9kHz,采样频率为8kHz,由图看出,时序图相似。分析为三种信号频率差异过小,当频率为500Hz的信号被8kHz的采样率重构时,可看出采样率对不同频率信号的影响。
图2. 2 500、7K、9KHz信号时域图
2.2 单音正弦信号采样序列的DFT结果绘图
2.2.1 实验要求
-计算已知正弦信号的DFT谱
-设定不同的仿真配置,观察正弦信号的DFT谱
* 改变DFT的计算长度
* 改变输入正弦信号采样序列的频率
分析信号如下
采样率fs=8kHz
信号采样序列长度N=32
配置参数
f1=3000 Hz; Amp1=1; phy1=0
f2=500Hz; Amp2=1; phy2=0
f3=3000Hz; Amp3=1; phy3=0
2.2.2 matlab程序
主程序,包括参数设置sine_1_tone_dft.m
% file: sine_1_tone_dft.m
% test with Matlab r2015b
close all; clear;
fig_fname_0 = 'sine_1_tone_dft_0.jpg';
fig_fname_1 = 'sine_1_tone_dft_1.jpg';
fig_fname_2 = 'sine_1_tone_dft_2.jpg';
fs = 8E3;
f0_0 = 3000; f0_1 = 500; f0_2 = 3000;
N_0 = 32 ; N_1 = 32 ; N_2 = 35 ;
% plot each case
func_sine_1_tone_dft_plot(f0_0, fs, N_0, fig_fname_0);
func_sine_1_tone_dft_plot(f0_1, fs, N_1, fig_fname_1);
func_sine_1_tone_dft_plot(f0_2, fs, N_2, fig_fname_2);
绘制信号的时域图、线性幅度谱和对数幅度谱func_sine_1_tone_dft_plot.m
function func_sine_1_tone_dft_plot(f0, fs, N, fig_fname);
n_idx = [0:N-1]; % 信号序列的下标向量
x = sin(2*pi*f0/fs*n_idx); % 生成正弦信号序列
y = abs(fft(x)); y_dB = 20*log10(1E-6+y); % 计算 DFT 结果线性幅度谱及对数幅度谱
h = figure;
% 绘图横轴左右边界
x_left = -1; x_right = N+1;
% 时域绘图
subplot(3,1,1);
stem(n_idx, x); grid on; hold;
plot(n_idx, x); xlim([x_left, x_right]);
xlim([x_left, x_right]);
title_str = ['f0:', num2str(f0),'Hz, ', 'fs:', num2str(fs),'Hz, ' 'N:', num2str(N)];
title(title_str, 'fontsize',14);
% 绘图线性幅度谱
subplot(3,1,2); stem(n_idx, y); grid on;
xlim([x_left, x_right]);
title_str = ['DFT Magtitude Linear Scale, '];
title_str = [title_str, ' Max:', num2str(max(y)), ', Min:', num2str(min(y))];
title(title_str, 'fontsize',14);
% 绘图对数幅度谱
subplot(3,1,3); stem(n_idx, y_dB); grid on;
xlim([x_left, x_right]);
title_str = ['DFT Magtitude dB Scale, '];
title_str = [title_str, ' Max:', num2str(max(y_dB)), ', Min:', num2str(min(y_dB))];
title(title_str, 'fontsize',14);
print(h, '-djpeg', fig_fname); % 保存绘图结果文件
end
2.2.3 实验结果
图2. 3 3KHz时域、频域、对数频谱图
采样序列中包含12个完整的信号周期采样值,DFT幅度谱上有两根峰值谱线,其余位置均为0.
图2. 4 500Hz信号时域、频域、对数频谱图
采样序列包括2个完整的采样周期,DFT幅度谱有两根峰值谱线,其余位置均为0.
图2. 5 3KHz信号时域、频域、对数频谱图
采样序列中包含13个完整的信号周期,以及一个不完整的信号周期采样值。DFT幅度谱分析结果有2根极大值谱线,但其余位置不为0.
2.2.4 实验分析
当采样周期是信号周期的整数倍时,信号采样后的DFT分析结果与连续信号的傅里叶变换频谱最相似。否则发生频谱泄露。
2.3 有限长矩形窗序列的DTFT
因计算机只能计算有限长和离散化的数据,因此使用计算机进行信号处理时,需要将模拟信号变为有限长、离散的数字信号,即对信号进行离散事件序列傅里叶变换DTFT。
2.3.1 matlab程序
主程序,包括参数设置rec_dtft_plot.m
clc
clear
close all
w_min = -1*pi;
w_max = 1*pi;
w_delta = pi/1000;
% 可修改
n_min = 0;
n_max = 3 ;
n = [n_min:1:n_max];
w = [w_min:w_delta:w_max];
N = length(n);
x = ones(1,N);
x_dscp_str = 'x(n)';
Y = func_calc_dtft(x, n, w);
h = func_plot_dtft(x,n,w,Y, x_dscp_str);
计算矩形窗的DTFT, func_calc_dtft.m
% Y(w) = DTFT(x[n]);
function Y = func_calc_dtft(x, n, w)
N