% 生成信号 fs = 10000; t = 0:1/fs:1-1/fs; x = sin(2*pi*1000*t); % 窗函数 win_dict = containers.Map({'rect', 'hanning', 'hamming', 'blackman', 'kaiser'}, {'boxcar', 'hann', 'hamming', 'blackman', @(L) kaiser(L, 5)}); win_len = 256; % 频谱分析 figure; win_names = keys(win_dict); % 获取窗函数名称 for idx = 1:numel(win_names) win_name = win_names{idx}; % 获取窗函数名称 win_func = win_dict(win_name); % 获取窗函数 win = window(win_func, win_len); % 计算窗函数 xw = x(1:win_len) .* win'; % 应用窗函数 Xw = fft(xw, win_len); % 进行FFT freq = linspace(0, fs/2, win_len/2+1); % 计算频率 Xw_db = 20*log10(abs(Xw(1:win_len/2+1))); % 转换为分贝 Xw_db = Xw_db - max(Xw_db); % 归一化 plot(freq, Xw_db, 'DisplayName', win_name); % 绘制曲线 hold on; end % 图像显示 xlim([0, 5000]); ylim([-60, 0]); xlabel('Frequency (Hz)'); ylabel('Magnitude (dB)'); legend('show'); hold off; grid on; 帮我把每一句后面都加上注释
时间: 2024-03-26 09:36:07 浏览: 47
好的,以下是每句代码的注释:
```
% 生成信号
fs = 10000; % 采样率为10000Hz
t = 0:1/fs:1-1/fs; % 时间序列,从0s到1s,步长为1/fs
x = sin(2*pi*1000*t); % 生成频率为1000Hz的正弦波信号
% 窗函数
win_dict = containers.Map({'rect', 'hanning', 'hamming', 'blackman', 'kaiser'}, {'boxcar', 'hann', 'hamming', 'blackman', @(L) kaiser(L, 5)}); % 定义窗函数字典,用于后面的循环使用
win_len = 256; % 窗口长度为256个采样点
% 频谱分析
figure; % 新建一个图形窗口
win_names = keys(win_dict); % 获取窗函数名称
for idx = 1:numel(win_names) % 遍历每种窗函数
win_name = win_names{idx}; % 获取当前窗函数名称
win_func = win_dict(win_name); % 获取当前窗函数
win = window(win_func, win_len); % 计算当前窗函数
xw = x(1:win_len) .* win'; % 应用当前窗函数
Xw = fft(xw, win_len); % 进行FFT
freq = linspace(0, fs/2, win_len/2+1); % 计算频率
Xw_db = 20*log10(abs(Xw(1:win_len/2+1))); % 转换为分贝
Xw_db = Xw_db - max(Xw_db); % 归一化
plot(freq, Xw_db, 'DisplayName', win_name); % 绘制当前窗函数的曲线
hold on; % 在图形窗口中保持当前窗函数的曲线
end
% 图像显示
xlim([0, 5000]); % 设置X轴范围为0~5000Hz
ylim([-60, 0]); % 设置Y轴范围为-60~0dB
xlabel('Frequency (Hz)'); % 设置X轴标签为频率(单位Hz)
ylabel('Magnitude (dB)'); % 设置Y轴标签为幅度(单位dB)
legend('show'); % 显示窗函数名称的图例
hold off; % 关闭保持图形窗口当前曲线的状态
grid on; % 打开网格线
阅读全文