使用代碼
"""
@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
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/124400.html
相關文章
-
如何反轉CSS中的貝塞爾曲線
摘要:我們并不需要知道貝塞爾曲線背后的所有數學知識。我們可以使用相同的并設置并反轉貝塞爾曲線,這樣就實現了在正反兩個方向上使用同一個的效果。我們來看看如何計算反向的貝塞爾曲線。 首先來看一看我之前寫的一個CSS輪播動畫效果,為了讓切換時動畫的過渡更加的平滑我在animation-timing-function屬性中并沒有使用CSS提供的各種關鍵詞,而使用了cubic-bezier(貝塞爾)函...
-
如何反轉CSS中的貝塞爾曲線
摘要:我們并不需要知道貝塞爾曲線背后的所有數學知識。我們可以使用相同的并設置并反轉貝塞爾曲線,這樣就實現了在正反兩個方向上使用同一個的效果。我們來看看如何計算反向的貝塞爾曲線。 首先來看一看我之前寫的一個CSS輪播動畫效果,為了讓切換時動畫的過渡更加的平滑我在animation-timing-function屬性中并沒有使用CSS提供的各種關鍵詞,而使用了cubic-bezier(貝塞爾)函...
-
如何反轉CSS中的貝塞爾曲線
摘要:我們并不需要知道貝塞爾曲線背后的所有數學知識。我們可以使用相同的并設置并反轉貝塞爾曲線,這樣就實現了在正反兩個方向上使用同一個的效果。我們來看看如何計算反向的貝塞爾曲線。 首先來看一看我之前寫的一個CSS輪播動畫效果,為了讓切換時動畫的過渡更加的平滑我在animation-timing-function屬性中并沒有使用CSS提供的各種關鍵詞,而使用了cubic-bezier(貝塞爾)函...
-
JavaScript基本運動封裝函數(1)
摘要:為回調函數等于已過時間初始值距離總時間勻速加速曲線減速曲線加速減速曲線加加速曲線減減速曲線加加速減減速曲線正弦衰減曲線彈動漸入正弦增強曲線彈動漸出回退加速回退漸入回縮的距離彈球減振彈球漸出 function doMove(obj, json, time, fx, fn) //fn為回調函數 { clearInterval(obj.iTimer); var fx = fx || li...
發表評論
0條評論
番茄西紅柿
男|高級講師
TA的文章
閱讀更多tensor
閱讀 713·2023-04-25 19:43
Windows 下安裝 XGBoost
閱讀 3910·2021-11-30 14:52
Hadoop 2.6.0 啟動問題 lib/native/libhadoop.so which mi
閱讀 3784·2021-11-30 14:52
VmShell:黑五美國VPS,免費先開通測試,滿意后付款!支持tiktok美區
閱讀 3852·2021-11-29 11:00
百度智能云:云產品特惠福利,1核2G輕量應用服務器僅48元/年
閱讀 3783·2021-11-29 11:00
Linux系統和寶塔面板如何啟用禁ping功能?
閱讀 3869·2021-11-29 11:00
301重定向怎么做?301重定向設置方法有幾種
閱讀 3557·2021-11-29 11:00
wordpress網站重定向次數過多的解決方法
閱讀 6105·2021-11-29 11:00