7

我可以使用重采样来对整个信号进行音调移位,并且我在 这里尝试了相位声码器代码。

我也尝试过repmat 和插值,我研究了fft 和 interp1

如何随着时间的推移逐渐/逐渐改变信号的音高? 我已经包含了原始信号的示例以及我试图让处理后的信号听起来像什么(我使用 Audacity 并使用它们的效果创建了处理过的信号Sliding time scale / pitch shift)但想在 Octave 4.0 中创建这个信号。如果您收听已处理的信号,您可以听到文件的音高逐渐增加,但文件的长度(秒)与原始信号文件相同。

我正在使用类似于 Matlab 的 Octave 4.0

这是可以改变整个信号的音高并在几秒钟内保持原始信号长度相同的代码,但我不确定如何让它随着时间的推移逐渐改变信号的音高。感谢 rayryeng 让我走到这一步。

clear, clc
[ya, fs, nbitsraw] = wavread('/tmp/original_signal.wav');

num_per_sec=2.4; %// Define total number of times we see the signal

%// Get total number of integer times we see the signal
num_whole = floor(num_per_sec);

%// Replicate signal
yb=repmat(ya,num_whole,1);

%// Determine how many samples the partial signal consists of
portion = floor((num_per_sec - num_whole)*length(ya));

%// Sample from the original signal and stack this on top of replicated signal
yb = [yb; ya(1:portion)];

%interpolation
xxo=linspace(0,1,length(yb))'; 
xxi=linspace(0,1,length(ya))'; 
yi_t=interp1(xxo,yb,xxi,'linear');

wavwrite([yi_t'] ,fs,16,strcat('/tmp/processed_signal.wav'));  % export file
4

1 回答 1

6

我的答案与您发布的结果并不完全相同,但我认为它很有趣且足够简单,可以为您提供音高拉伸背后的重要概念。我还没有找到我在网上其他地方提出的方法,但我无法想象以前没有人想到过这个,所以它可能有一个名字。

首先要意识到的是,如果你想随着时间的推移对音高应用变换,而不仅仅是在整个时间过程中偏移它,你需要使用在每个时间点定义的音高“特征” (例如 time-频率变换),而不是总结整个信号内容的那些(例如傅立叶)。

认识到这一点很重要,因为很明显,我们需要涉及信号的瞬时频率之类的东西,它被定义为希尔伯特相位的导数(通常(1/2Pi) * dPhi/ dt以赫兹而不是 rad/s 为单位工作)。

假设我们可以转换一个信号的瞬时频率,那么我们可以将“逐渐增加音高”的想法正式转化为“在瞬时频率上增加一个线性增加的偏移量”。好消息是,我们可以很容易地使用解析变换来变换信号的瞬时频率。方法如下:

function y = add_linear_pitch( x, fs, df )
%
% y = add_linear_pitch( x, fs, df )
%
% x, fs: audio signal (1-dimensional)
% df: the amplitude of frequency offset, in Hz
%
% See also: hilbert
%

    x = x(:);
    n = numel(x); % number of timepoints
    m = mean(x); % average of the signal
    k = transpose(0:n-1); 

    h = hilbert( x - m ); % analytic signal
    e = abs(h); % envelope
    p = angle(h) + df*pi*k.^2/fs/n; % phase + linearly increasing offset
    y = m - imag(hilbert( e .* sin(p) )); % inverse-transform

end

前面代码中唯一不明显的是,我们需要在将“线性增加的音高偏移”(或瞬时频率的任何变换)应用于相位之前对其进行积分,并将其乘以2Pi(以弧度为单位)。在我们的例子中,线性函数的积分只是一个二次函数,但你可以玩更复杂的东西:)

于 2017-06-24T18:33:25.743 回答