-2

インポートされた信号のピッチを時間の経過と共に対数的にまたは指数関数的に変更するにはどうすればよいですか?インポートした信号のピッチを対数/指数関数的に時間をかけて変更する

私はボーカルオーディオファイルをインポートするので、単純なスイープやチャープコマンドは機能しませんので、以下の例を作成しました。私が持っている問題をテスト/表示することができます。

信号のピッチをリニアに変更することができます。これは、テストコードと周波数プロットのパート1を参照してください。おかげで、私は以下の持っているコードとコード

%Sweep question part 1 
clear all,clf reset,tic,clc 
pkg load signal %load packages 

%%%----create signal 
start_freq=500; 
end_freq=20; 
fs=22050 
len_of_sig=7; %in seconds 
t=linspace(0,2*pi*len_of_sig,fs*len_of_sig); 
orig_sig1=.8*sin(start_freq*t); 
wavwrite([orig_sig1(:)] ,fs,16,strcat('/tmp/0_sig.wav')); % export file 

%%%---import signal 
[ya, fs, nbitsraw] = wavread('/tmp/0_sig.wav'); 

orig_total_samples=length(ya); %make this the same length as signal wave 
t_import=linspace(0,2*pi*(orig_total_samples/fs),orig_total_samples); 

%%%%----Begin linsweep 
x = ya(:); 
fac=(end_freq-start_freq)/length(x); %linear slope 

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

h = hilbert(x - m); % analytic signal 
env1 = abs(h); % envelope 
sweep=fac*pi*k.^2/(fs); %linearly increasing offset original %alter curve here 
p = angle(h) + sweep; % phase + linearly increasing offset original 

y = m - imag(hilbert(env1 .* sin(p))); % inverse-transform 
wavwrite([y(:)] ,fs,16,strcat('/tmp/0_sweep.wav')); % export file 

%%%----------Used for plotting 
z = hilbert(y); 
instfreq = fs/(2*pi)*diff(unwrap(angle(z))); %orginal 
t_new=t_import/(2*pi); %converts it to seconds 

plot(t_new(2:end),instfreq,'-r') 

xlabel('Time (secnds)') 
ylabel('Frequency (Hz)') 
grid on 
title('Instantaneous Frequency') 

Linear Plot

の問題のためにSheljohnします:

1)周波数が開始または正しい周波数で終了しません。

2)それは正しい斜面

私はそれが私がちょうどそれらを正しく計算するかどうかはわかりません変数とFACを行い、を掃除しなければならないと信じていません。

fac=log(start_freq/end_freq)/length(x); %slope 
sweep=-(start_freq)*exp(fac*k); %alter curve here 

-

%-----------------Sweep question part 2 
clear all,clf reset,tic,clc 
pkg load signal %load packages 

%%%----create signal 
start_freq=500; 
end_freq=20; 
fs=22050 
len_of_sig=7; %in seconds 
t=linspace(0,2*pi*len_of_sig,fs*len_of_sig); 
orig_sig1=.8*sin(start_freq*t); 
wavwrite([orig_sig1(:)] ,fs,16,strcat('/tmp/0_sig.wav')); % export file 

%%%---import signal 
[ya, fs, nbitsraw] = wavread('/tmp/0_sig.wav'); 

orig_total_samples=length(ya); %make this the same length as signal wave 
t_import=linspace(0,2*pi*(orig_total_samples/fs),orig_total_samples); 

%%%%----Begin linsweep 
x = ya(:); 
fac=log(start_freq/end_freq)/length(x); %slope 

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

h = hilbert(x - m); % analytic signal 
env1 = abs(h); % envelope 
sweep=-(start_freq)*exp(fac*k); %alter curve here 
p = angle(h) + sweep; % phase + increasing offset 

y = m - imag(hilbert(env1 .* sin(p))); % inverse-transform 
wavwrite([y(:)] ,fs,16,strcat('/tmp/0_sweep.wav')); % export file 

%%%----------Used for plotting 
z = hilbert(y); 
instfreq = fs/(2*pi)*diff(unwrap(angle(z))); %orginal 
t_new=t_import/(2*pi); %converts it to seconds 

plot(t_new(2:end),instfreq,'-r') 

xlabel('Time (seconds)') 
ylabel('Frequency (Hz)') 
grid on 
title('Instantaneous Frequency') 

Incorrect frequency and slope

開始周波数が500Hzの時に始まり、20Hzのに行くときに私が取得しようとしている斜面です。そして開始周波数が20hzから始まり、500hzになると。以下のプロットを参照してください。注:これらの周波数は変化するので、必要なときにこれらのスロープを計算する正しい公式/方程式を取得しようとしています。

500hz to 20hz

20hz to 500hz

シモンズ:私はMatlabのに似ているオクターブ4.0を使用しています。

私はボーカルオーディオファイルをインポートするので、単純なスイープやチャープコマンドは機能しませんので、以下の例を作成しました。私が持っている問題をテスト/表示することができます。

+1

この質問を見てMATLABを使用している人は、 'pkg load signal%load packages'という行をコメントアウトして削除してください。 – informaton

答えて

0

コードに以下の変更を加えて、興味のあるプロットのように見えるようにすることができます。それらのうちのいくつかは私のためだけに美容的です(私は時間変数が好きなように秒単位で残ります)。

desired slope

関連する変更:
から:

t=linspace(0,2*pi*len_of_sig,fs*len_of_sig); 
orig_sig1=.8*sin(start_freq*t); 
fac=log(start_freq/end_freq)/length(x); %slope 

へ:ここ

t=linspace(0,len_of_sig,fs*len_of_sig); 
orig_sig1=0.8*sin(start_freq*t*2*pi);  
fac=log(end_freq/start_freq)/length(x); 
sweep=(start_freq*2*pi/fs)*exp(fac*k); %alter curve here 

私が作ったいくつかの他の変更、

y = env1.*sin(p);  
% and later for consistency 
t_import=linspace(0,orig_total_samples/fs,orig_total_samples); 
t_new=t_import; %t is seconds 
ました

facは、あなたの最初と最後との違いになるので、それはlog(endFreq)-log(startFreq)またはlog(endFreq/startFreq)となり、長さの正規化が追加されます。これは、前にマイナス記号をつけて反転することができます。

がラジアンであるp=angle(h)+sweep;を計算するために使用すると、掃引に関する1つの問題が発生している可能性があります。

ラジアン対Hz単位の問題が原因の一部です。

+1

チャットに関する良い議論。他の誰かがここから継続して私が持っていた初期の混乱をスキップしたいと思っても、あなたが探していたものではなかったので別の日にそれを削除したい場合は、もう一度答えを残しておきます。 – informaton

関連する問題