修改NFFT = 2^nextpow2(win_len); f = linspace(0, Fs/2, NFFT/2+1); t = (win_len/2:overlap_len:length(x)-win_len/2-1) / Fs; spec = zeros(NFFT/2+1, length(t)); for i = 1:length(t) frame = frames(:, i); spec(:, i) = abs(fft(frame, NFFT)).^2 / (NFFT * sum(win.^2)); end figure; imagesc(t, f, 10*log10(spec)); axis xy; xlabel('Time (s)'); ylabel('Frequency (Hz)'); title('Spectrogram'); colorbar;
时间: 2024-03-25 09:36:46 浏览: 67
nfft.rar_fft_nfft_vhdl_fft
好的,我来帮您修改代码。
根据您的代码,NFFT 的值是根据窗长 win_len 计算得出的,为 2 的幂次方。建议将 NFFT 的值设置为比 win_len 更大的值,例如 1024 或 2048,以获得更好的频谱分辨率。同时,您可以使用 mat2gray 函数将 spec 矩阵转换为灰度图像,以更清晰地显示声谱图。
以下是修改后的代码:
```matlab
% 加载音频文件
[x, Fs] = audioread('1.wav');
% 定义窗长和重叠长度
win_len = round(0.03 * Fs); % 窗长为30ms
overlap_len = round(0.015 * Fs); % 重叠长度为15ms
% 定义窗函数
win_type = 'hamming'; % 汉明窗
% win_type = 'rectwin'; % 矩形窗
win = window(win_type, win_len);
% 分帧并加窗
frames = buffer(x, win_len, overlap_len, 'nodelay');
frames = frames .* repmat(win, 1, size(frames, 2));
% 绘制时域波形
figure;
subplot(2, 1, 1);
plot(x);
xlabel('Time (s)');
ylabel('Amplitude');
title('Original Signal');
subplot(2, 1, 2);
plot(frames(:, 1));
xlabel('Samples');
ylabel('Amplitude');
title('Windowed Frame');
% 计算并绘制短时傅里叶变换
NFFT = 2048; % 设置 NFFT 的值为 2048
f = linspace(0, Fs/2, NFFT/2+1);
t = (win_len/2:overlap_len:length(x)-win_len/2-1) / Fs;
spec = zeros(NFFT/2+1, length(t));
for i = 1:length(t)
frame = frames(:, i);
spec(:, i) = abs(fft(frame, NFFT)).^2 / (NFFT * sum(win.^2));
end
% 转换为灰度图像并绘制声谱图
figure;
imagesc(t, f, mat2gray(10*log10(spec)));
axis xy;
xlabel('Time (s)');
ylabel('Frequency (Hz)');
title('Spectrogram');
colorbar;
```
希望这次修改能够满足您的需求。
阅读全文