音频信号的三次样条插值学习笔记
March 12, 2020, 9:32 p.m.
read: 1590
对音频信号进行三次样条插值(Cubic Spline Interpolation)
以8k插值为16k信号为例,下方为matlab代码
[y, fs] = audioread('8k.wav'); % 读取原始的音频文件
y = y'; % 对音频数据进行转置
y_size = size(y); % 读取音频文件的长度信息,第一维度是ch,此处为1
x = 0:1:y_size(2)-1; % 构造出原始x坐标为 [0,1,2,...音频长度-1]
xi = 0:0.5:y_size(2)-0.5; % 构造出新坐标系,8k到16k,在相同的时间内,采样2倍的信号,因此重采样的x坐标为[0, 0.5, 1, 1.5, 2, 2.5, ...音频长度-0.5]
yi = spline(x,y,xi); % 进行三次样条插值
audiowrite('cpl_16k.wav', yi, 16000); % 将得到的值按16k回写至文件系统
三次样条插值结果:
附python实现
import soundfile as sf
from scipy.interpolate import interp1d
import numpy as np
y, sr = sf.read('8k.wav')
x = np.arange(0, y.shape[0], 1)
xi = np.linspace(x.min(), x.max() + 0.5, x.shape[0] * 2)
yi = interp1d(x, y, kind='cubic', bounds_error=False)(xi)
sf.write('cpl_16k.wav', yi, 16000)
参考
如何使用matlab软件对离散数据进行三次样条插值-百度经验
Cubic spline data interpolation - MATLAB spline
SciPy样条插值 - Python学习园
scipy.interpolate.interp1d()函数详解Python漫步量化-CSDN博客