我可以使用resample對整個信號進行音高移位,並嘗試了相位聲碼器代碼here。使用倍頻程/ matlab代碼隨時間遞增/逐漸改變信號音調
我也試過repmat and interpolation,我看着fft and interp1
我怎樣才能逐步/逐步改變信號的音高隨着時間的推移?我已經包含了一個Original Signal的示例,我試圖讓Processed Signal聽起來像(我使用Audacity創建了處理後的信號並使用其效果Sliding time scale/pitch shift
)但是想要在Octave 4.0中創建此信號。 如果您聆聽Processed Signal,則可以聽到文件的音高逐漸增加,但該文件與Original Signal文件的長度(秒)相同。
我使用倍頻4.0是像Matlab
這裏是可以改變整個信號的間距,並保持以秒爲原始信號的長度相同的代碼,但我不知道如何逐漸改變信號的音高。感謝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
既然你似乎有興趣爲語音信號做這個,那麼你可能想看看分析/重新合成工具,如[PSOLA](https://en.wikipedia.org/wiki/PSOLA)。像這樣的工具應該給予更自然的音高變化。 (請注意,PSOLA相當長 - 現在可能會有更好的選擇。) –
大膽使用[sbsms](https://sourceforge.net/projects/sbsms/)用於Subband Sinusoidal Modeling的庫。如果你想要你可以重寫所有的MATLAB/Octave,或者你可以編譯它並將它用作mex/oct – rahnema1