未解析的引用 'pitch_names'
时间: 2023-12-10 07:06:20 浏览: 26
抱歉,我没有注意到这个问题。在这个代码片段中,pitch_names应该是一个包含音高名称的列表或元组,例如:
```
pitch_names = ['C', 'C#', 'D', 'D#', 'E', 'F', 'F#', 'G', 'G#', 'A', 'A#', 'B']
```
这个列表中包含了12个不同的音高名称,分别代表了钢琴键盘上的12个键,从C开始一直到B。这个列表经常用于将音高的数字表示转换为其对应的名称表示。
相关问题
for i = 1:fn % 提取当前帧 current_frame = y(:,i); % 计算当前帧的 Stockwell 变换,将频率范围限制在 0 到 4000 Hz [st_matrix, ~,~] = st(current_frame,0,fs/2,fs,1); % 将当前帧的 Stockwell 变换结果存储到 st_matrices st_matrices{i} = st_matrix; b = abs(st_matrix); % 计算帧的能量 frame_energy = sum(b.^2); if frame_energy > energy_threshold % 寻找模值最大的位置 [~, max_peak_idx] = max(b); max_peak_idx = max_peak_idx(1); % 计算基频 pitch_frequency = fs /max_peak_idx; if pitch_frequency > 1000 || pitch_frequency < 70 pitch_frequencies(i)=0; continue; end % 估计基音周期 pitch_period = 1/pitch_frequency; % 存储基音周期和基频 pitch_periods(i) = pitch_period; pitch_frequencies(i) = pitch_frequency; end end优化计算基频的代码
可以使用自相关函数来进行基频的估计,具体实现可以将信号进行自相关,然后找到自相关函数的第一个峰值,该峰值对应的位置即为基音周期,基音频率即为采样率除以基音周期。
下面是使用自相关函数进行基频估计的代码示例:
```
for i = 1:fn
% 提取当前帧
current_frame = y(:,i);
% 计算自相关函数
autocorr_values = xcorr(current_frame);
% 找到自相关函数的第一个峰值
[~, max_peak_idx] = max(autocorr_values);
pitch_period = max_peak_idx - 1;
% 计算基频
pitch_frequency = fs / pitch_period;
if pitch_frequency > 1000 || pitch_frequency < 70
pitch_frequencies(i) = 0;
continue;
end
% 存储基音周期和基频
pitch_periods(i) = pitch_period;
pitch_frequencies(i) = pitch_frequency;
end
```
这样的实现可以大大减少计算量,提高基频估计的效率。
所以我只需要将adjusted_fft_frames = mag_frames * np.exp(1j * 2 * np.pi * pitch_freqs_smoothed[:, np.newaxis] * freqs[np.newaxis, :])这段代码替换成pitch_freqs_smoothed = pitch_freqs_smoothed[:, np.newaxis]pitch_freqs_smoothed = np.tile(pitch_freqs_smoothed, (1, mag_frames.shape[1]))adjusted_fft_frames = mag_frames * np.exp(1j * 2 * np.pi * pitch_freqs_smoothed * freqs[np.newaxis, :])就行了吗
是的,你可以将原来的代码替换为新的代码,但是需要注意一下 `freqs` 数组的长度是否正确,以确保可以正确进行广播操作。同时,也需要确保 `pitch_freqs_smoothed` 被正确地转换为 `(198, 882)` 的形状。
完整的代码修改如下:
```
freqs = np.fft.rfftfreq(n_fft, d=1.0/sr)
pitch_freqs_smoothed = pitch_freqs_smoothed[:, np.newaxis]
pitch_freqs_smoothed = np.tile(pitch_freqs_smoothed, (1, mag_frames.shape[1]))
adjusted_fft_frames = mag_frames * np.exp(1j * 2 * np.pi * pitch_freqs_smoothed * freqs[np.newaxis, :])
```
这个修改后的代码会将 `pitch_freqs_smoothed` 转换为一个形状为 `(198, 882)` 的数组,然后使用广播机制将其与 `freqs` 相乘,得到一个形状为 `(198, 882)` 的新的振幅谱矩阵 `adjusted_fft_frames`。