无法执行赋值,因为左侧的大小为 1×882,右侧的大小为 1×1763。 出错 lesson4 (第 14 行) acf(i,:) = xcorr(x1(i,:));
时间: 2024-05-17 19:19:17 浏览: 100
这个错误提示表明左侧的矩阵 `acf(i,:)` 的大小为 1 行 882 列,而右侧的矩阵 `xcorr(x1(i,:))` 的大小为 1 行 1763 列,两者的列数不一致,因此无法进行赋值操作。你需要检查一下代码,看看是不是在计算 `xcorr(x1(i,:))` 的时候出了问题,可能是输入的参数有误或者计算方法有误。你需要保证 `xcorr(x1(i,:))` 的大小和 `acf(i,:)` 的大小一致,才能进行赋值操作。
相关问题
% 定义一些常量fft_size = 2048;hop_size = fft_size/4;min_freq = 80;max_freq = 1000;% 读取音频文件filename = 'example.aac';[x, Fs] = audioread(filename);% 计算音高[f0, ~] = yin(x, Fs, fft_size, hop_size, min_freq, max_freq);f0 = medfilt1(f0, 5); % 中值滤波midi = freq2midi(f0);% 计算主音调[~, max_idx] = max(histcounts(midi, 1:128));dominant_note = max_idx - 1;% 输出结果fprintf('主音调:%.2f Hz\n', midi2freq(dominant_note));function [f0, rms_energy] = yin(x, fs, fft_size, hop_size, min_freq, max_freq)% YIN算法计算音频信号的基频% 初始化变量n_frames = floor((length(x)-fft_size)/hop_size) + 1;f0 = zeros(n_frames, 1);rms_energy = zeros(n_frames, 1);% 计算自相关函数x = x(:);x = [x; zeros(fft_size, 1)];acf = xcorr(x, fft_size, 'coeff');acf = acf(ceil(length(acf)/2):end);% 计算差值函数d = zeros(fft_size, n_frames);for i = 1:n_frames frame = x((i-1)*hop_size+1:(i-1)*hop_size+fft_size); for tau = 1:fft_size d(tau, i) = sum((frame(1:end-tau) - frame(1+tau:end)).^2); endend% 计算自相关函数的倒数acf_recip = acf(end:-1:1);acf_recip(1) = acf_recip(2);acf_recip = acf_recip.^(-1);% 计算累积平均能量running_sum = 0;for i = 1:n_frames running_sum = running_sum + sum(x((i-1)*hop_size+1:(i-1)*hop_size+fft_size).^2); rms_energy(i) = sqrt(running_sum/fft_size);end% 计算基频for i = 1:n_frames r = acf_recip./(acf(i:end).*acf_recip(1:end-i+1)); r(1:i) = 0; r(max_freq/fs*fft_size+1:end) = 0; [~, j] = min(r(min_freq/fs*fft_size+1:max_freq/fs*fft_size)); f0(i) = fs/j;endendfunction midi = freq2midi(freq)% 将频率转换为MIDI码midi = 12*log2(freq/440) + 69;endfunction freq = midi2freq(midi)% 将MIDI码转换为频率freq = 440*2^((midi-69)/12);end对于此运算,数组的大小不兼容。 出错 yin (第 26 行) r = acf_recip./(acf(i:end).*acf_recip(1:end-i+1)); 出错 untitled2 (第 8 行) [f0, ~] = yin(x, Fs, fft_size, hop_size, min_freq, max_freq);请修改以上错误
这个问题是一个MATLAB代码错误,请先检查你的输入音频文件是否存在,并且检查你在函数调用yin()时传递的参数是否正确。如果参数正确,那么请检查yin()函数的代码第26行,尝试修改为:
```
r = acf_recip./(acf(i:end).*acf_recip(1:end-i)');
```
这里增加了一个转置操作,以使得acf_recip(1:end-i+1)和acf(i:end)的大小相同。
matlab acf(1)
在MATLAB中,`acf(1)`是用于计算一维自相关函数(ACF)的函数。ACF是衡量数据序列自身延迟版本之间的相关性的统计工具。
`acf(1)`函数的使用语法是:
```matlab
[r, lags] = acf(data, lag)
```
其中,`data`表示输入的数据序列,`lag`表示要计算的滞后数。滞后数是指计算自相关函数时,将数据序列向后移动的步数。
该函数返回两个变量:`r`和`lags`。`r`是计算得到的自相关函数值,`lags`是相应的滞后数。
假设我们有一个长度为N的数据序列`data`,我们可以使用`acf(1)`函数计算其滞后为1的自相关函数值。下面是一个示例:
```matlab
data = rand(1, N); % 生成一个长度为N的随机数据序列
lag = 1; % 设置滞后数为1
[r, lags] = acf(data, lag); % 计算自相关函数
plot(lags, r); % 绘制自相关函数
xlabel('Lags'); % x轴标签
ylabel('ACF'); % y轴标签
title('ACF with lag 1'); % 图标题
```
上述代码将计算数据序列`data`的滞后为1的自相关函数,并以滞后数为x轴,自相关函数值为y轴绘制出来。
自相关函数的值范围在-1到1之间,当自相关函数值接近1时,表示序列具有较强的正相关性;当自相关函数值接近-1时,表示序列具有较强的负相关性;当自相关函数值接近0时,表示序列之间没有明显的线性相关性。
阅读全文