优化计算基频的代码
时间: 2023-12-09 19:05:16 浏览: 38
可以使用更高效的方法计算基频,而不是将所有的频率值都计算一遍再找到最大值。可以使用自相关函数来进行基频的估计。具体实现可以将信号进行自相关,然后找到自相关函数的第一个峰值,该峰值对应的位置即为基音周期,基音频率即为采样率除以基音周期。
下面是使用自相关函数进行基频估计的代码示例:
```
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
```
这样的实现可以大大减少计算量,提高基频估计的效率。
相关问题
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
```
这样的实现可以大大减少计算量,提高基频估计的效率。
python中从语音信号得到基频并显示的代码
要从语音信号中获取基频,您可以使用自相关函数和自适应阈值来找到基频周期。下面是一个示例代码,用于从语音信号中提取基频并显示:
```python
import numpy as np
import librosa
# 加载语音信号
signal, sr = librosa.load('audio_file.wav', sr=None)
# 计算自相关函数
corr = librosa.autocorrelate(signal, max_size=5000)
corr = corr[len(corr)//2:]
# 自适应阈值
threshold = np.mean(corr)
# 找到基频周期
periods = np.where(corr > threshold)[0]
period = periods[0] if len(periods) > 0 else 0
# 计算基频并显示
pitch = sr / period if period > 0 else 0
print('Pitch:', pitch)
```
请注意,这只是一个简单的示例代码,可能需要进行适当的调整和优化来适应您的特定应用场景。
相关推荐
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)