使用代码

"""
@FileName: Test.py
@Description: Implement Test
@Author: Ryuk
@CreateDate: 2020/12/08
@LastEditTime: 2020/12/08
@LastEditors: Please set LastEditors
@Version: v0.1
"""

from td_psola import *
import librosa
import soundfile as sf
import matplotlib.pyplot as plt


x, fs = librosa.load("./test.wav", sr=8000)
pitch_scale = 1.5
time_scale = 1.5
y = Processing(x, fs, pitch_scale, time_scale, cutoff_freq=500)
sf.write("./out.wav", y, fs)

fig=plt.figure()
ax=fig.add_subplot(2, 1, 1)
ax.plot(x)
ax=fig.add_subplot(2, 1, 2)
ax.plot(y)
plt.savefig("q.png")

if __name__ == __main__:
pass

实际代码

"""
@FileName: Algorithm.py
@Description: Implement Algorithm
@Author: Ryuk
@CreateDate: 2020/12/07
@LastEditTime: 2020/12/07
@LastEditors: Please set LastEditors
@Version: v0.1
"""

import numpy as np
from scipy import signal

def Processing(x, fs, pitch_scale, time_scale, cutoff_freq=500):
# normalize
x = x - np.mean(x)
x = x / np.max(np.abs(x))

#x = LowPassFilter(x, fs, cutoff_freq)
pitch = PitchEstimator(x, fs)
output = PitchMark(x, pitch, fs, pitch_scale, time_scale)
return output

def LowPassFilter(x, fs, cutoff_freq):
if cutoff_freq == 0:
return x
else:
factor = np.exp(-1 / (fs / cutoff_freq))
y = signal.filtfilt([1 - factor], [1, -factor], x)
return y


def PitchEstimator(x, fs):
frame_length = round(fs * 0.03)
frame_shift = round(fs * 0.01)
length = len(x)
frame_num = int(np.floor((length - frame_length)/ frame_shift)) + 2
frame_pitch = np.zeros(frame_num + 2)

frame_range = np.arange(0, frame_length)
for count in range(1, frame_num):
frame = x[frame_range]
frame_pitch[count] = PitchDetection(frame, fs)
frame_range += frame_shift

frame_pitch = signal.medfilt(frame_pitch, 5)

pitch = np.zeros(length)
for i in range(length):
index = int(np.floor((i + 1) / frame_shift))
pitch[i] = frame_pitch[index]
return pitch

def CenterClipping(x, clip_rate):
max_amplitude = np.max(np.abs(x))
clip_level = max_amplitude * clip_rate
positive_index = np.where(x > clip_level)
negative_index = np.where(x < -clip_level)
clipped_data = np.zeros(len(x))
clipped_data[positive_index] = x[positive_index] - clip_level
clipped_data[negative_index] = x[negative_index] + clip_level
return clipped_data

def AutoCorrelation(x, lags):
N = len(x)
auto_corr = np.correlate(x, x, mode = full)
assert N >= lags - 1
auto_corr = auto_corr[N - lags - 1 : N + lags]
auto_corr = auto_corr / np.max(auto_corr)
return auto_corr

def IsPeak(index, low, high, x):
if index == low or index == high:
return False
if x[index] < x[index-1] or x[index] < x[index+1]:
return False
return True

def PitchDetection(x, fs):
min_lag = round(fs / 500)
max_lag = round(fs / 70)
x = CenterClipping(x, 0.3)

auto_corr = AutoCorrelation(x, max_lag)
auto_corr = auto_corr[max_lag: 2 * max_lag]

search_range = auto_corr[min_lag - 1:max_lag]
max_corr

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/124400.html

相关文章

  • 如何反转CSS中的贝塞尔曲线

    摘要:我们并不需要知道贝塞尔曲线背后的所有数学知识。我们可以使用相同的并设置并反转贝塞尔曲线,这样就实现了在正反两个方向上使用同一个的效果。我们来看看如何计算反向的贝塞尔曲线。 首先来看一看我之前写的一个CSS轮播动画效果,为了让切换时动画的过渡更加的平滑我在animation-timing-function属性中并没有使用CSS提供的各种关键词,而使用了cubic-bezier(贝塞尔)函...

    zhangqh 评论0 收藏0
  • 如何反转CSS中的贝塞尔曲线

    摘要:我们并不需要知道贝塞尔曲线背后的所有数学知识。我们可以使用相同的并设置并反转贝塞尔曲线,这样就实现了在正反两个方向上使用同一个的效果。我们来看看如何计算反向的贝塞尔曲线。 首先来看一看我之前写的一个CSS轮播动画效果,为了让切换时动画的过渡更加的平滑我在animation-timing-function属性中并没有使用CSS提供的各种关键词,而使用了cubic-bezier(贝塞尔)函...

    nicercode 评论0 收藏0
  • 如何反转CSS中的贝塞尔曲线

    摘要:我们并不需要知道贝塞尔曲线背后的所有数学知识。我们可以使用相同的并设置并反转贝塞尔曲线,这样就实现了在正反两个方向上使用同一个的效果。我们来看看如何计算反向的贝塞尔曲线。 首先来看一看我之前写的一个CSS轮播动画效果,为了让切换时动画的过渡更加的平滑我在animation-timing-function属性中并没有使用CSS提供的各种关键词,而使用了cubic-bezier(贝塞尔)函...

    amc 评论0 收藏0
  • JavaScript基本运动封装函数(1)

    摘要:为回调函数等于已过时间初始值距离总时间匀速加速曲线减速曲线加速减速曲线加加速曲线减减速曲线加加速减减速曲线正弦衰减曲线弹动渐入正弦增强曲线弹动渐出回退加速回退渐入回缩的距离弹球减振弹球渐出 function doMove(obj, json, time, fx, fn) //fn为回调函数 { clearInterval(obj.iTimer); var fx = fx || li...

    hiyayiji 评论0 收藏0

发表评论

0条评论

最新活动