OCTAVE调用grabacion函数维度不匹配,求音频频谱生成解决方案
Octave频谱代码报错修复方案
报错根源
错误出现在补零对齐行,原代码语法错误导致生成了超大方阵,触发维度不匹配报错。
修复步骤
- 修复补零代码语法(核心错误)
原错误行:x=[x;zeros(nsample - length(x)),1];
替换为:x = [x; zeros(nsample - length(x), 1)];
说明:zeros(n)默认生成n行n列的方阵,是本次32768×32768维度报错的直接原因,添加第二个参数1指定生成n行1列的列向量,和输入音频的列维度匹配。 - 修正时间轴生成逻辑
原错误代码段:
替换为:dur = nsample / rate; %duraci\'on [seg] fs = 1 / rate; %tasa de muestreo [seg] t = 0:fs:dur; %eje de tiempo [seg]
说明:原代码变量名定义错误,且总时长计算偏差会导致时间轴长度比信号长度多1,后续绘图可能触发维度报错。ts = 1 / rate; % 采样间隔 [秒] dur = (nsample - 1) * ts; % 信号总时长 [秒] t = 0:ts:dur; % 时间轴 [秒] - 可选兼容处理
如果你的prueba.wav是双声道音频,可在[x, rate] = audioread('prueba.wav');行后添加x = mean(x, 2);,将双声道合并为单声道,避免后续处理出现维度异常。
修复后完整代码
function grabacion(fmax,Amax) % 读取音频文件 [x, rate] = audioread('prueba.wav'); % 双声道转单声道(可选,根据实际音频情况开启) % x = mean(x, 2); nsample = size(x, 1); % 音频采样点数 nsample = pow2(nextpow2(nsample)); % 补零到2的整数次幂长度 x = [x; zeros(nsample - length(x), 1)]; % 生成频率轴 ts = 1 / rate; % 采样间隔 [秒] dur = (nsample - 1) * ts; % 信号总时长 [秒] t = 0:ts:dur; % 时间轴 [秒] tam = length(t); f = (rate/2) * (1:tam/2) / (tam/2); %频率轴 [Hz] N_min = round(nsample * 20 / rate) + 1; N_max = round(nsample * fmax / rate) + 1; f = f(N_min:N_max); % 频谱计算 x = x .* hanning(length(x)); fftx = abs(fft(x)); fftx = fftx(N_min:N_max); fft_x = 20 * log10(fftx); % 转换为dB单位 % 绘图 figure; subplot(2,1,1) plot(f, fft_x', 'linewidth', 2); set(gca, 'linewidth', 2, 'fontsize', 14); axis([20 fmax 0 Amax]); title('Densidad Espectral de Energía' ); xlabel('Frecuencia [Hz]'); ylabel('Amplitud [dB]'); grid; nx=size(x,1); subplot(2,1,2) plot(t(1:nx),x', 'linewidth', 2); set(gca, 'linewidth', 2, 'fontsize', 14); title('función en el tiempo [seg]' ); xlabel('Tiempo [seg]'); ylabel('Amplitud [V]'); grid; endfunction
调用说明
调用时传入两个参数,分别是需要显示的最大频率fmax(单位Hz,比如设为20000)和最大振幅Amax(单位dB,比如设为100),示例调用:grabacion(20000, 100)
内容的提问来源于stack exchange,提问作者Mauricio Calderon Gomez
相关产品推荐
相关产品推荐

