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;>> Untitled3 无法执行赋值,因为左侧的索引与右侧的大小不兼容。 出错 Untitled3 (第 38 行) spec(:, i) = abs(fft(frame, NFFT)).^2 / (NFFT * sum(win.^2));
时间: 2023-11-03 22:04:23 浏览: 82
这段代码的错误提示是“无法执行赋值,因为左侧的索引与右侧的大小不兼容”,意味着 `spec(:, i)` 的维度和 `abs(fft(frame, NFFT)).^2 / (NFFT * sum(win.^2))` 的维度不匹配。可能的原因是 `spec` 的第二维度 `length(t)` 和 `i` 不匹配,或者是 `abs(fft(frame, NFFT)).^2 / (NFFT * sum(win.^2))` 的维度不正确。你可以检查 `frames`、`win`、`win_len`、`overlap_len`、`x` 和 `Fs` 是否正确,并检查它们的维度和数据类型是否与代码中的要求相符。
相关问题
修改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;
好的,我来帮您修改代码。
根据您的代码,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;
```
希望这次修改能够满足您的需求。
NFFT=2^nextpow2(L); Y=fft(y,NFFT)/L; f=Fs/2*linspace(0,1,NFFT/2+1);
这段代码是用来进行信号的快速傅里叶变换(FFT)的,其中:
- L 是信号的长度;
- NFFT 是 FFT 的点数,通过 nextpow2 函数计算出比 L 大且最接近 2 的整数次幂的值;
- y 是要进行 FFT 的信号;
- Y 是 FFT 变换后的结果,通过除以 L 对结果进行归一化;
- Fs 是信号的采样率;
- f 是频率轴,通过 linspace 函数生成从 0 到 Fs/2 的等间隔频率点,长度为 NFFT/2+1。
这段代码的作用是将时域上的信号转换到频域上,并计算出信号在不同频率下的能量分布情况。
阅读全文