インポートされた信号のピッチを時間の経過と共に対数的にまたは指数関数的に変更するにはどうすればよいですか?インポートした信号のピッチを対数/指数関数的に時間をかけて変更する
私はボーカルオーディオファイルをインポートするので、単純なスイープやチャープコマンドは機能しませんので、以下の例を作成しました。私が持っている問題をテスト/表示することができます。
信号のピッチをリニアに変更することができます。これは、テストコードと周波数プロットのパート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')
の問題のために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')
開始周波数が500Hzの時に始まり、20Hzのに行くときに私が取得しようとしている斜面です。そして開始周波数が20hzから始まり、500hzになると。以下のプロットを参照してください。注:これらの周波数は変化するので、必要なときにこれらのスロープを計算する正しい公式/方程式を取得しようとしています。
シモンズ:私はMatlabのに似ているオクターブ4.0を使用しています。
私はボーカルオーディオファイルをインポートするので、単純なスイープやチャープコマンドは機能しませんので、以下の例を作成しました。私が持っている問題をテスト/表示することができます。
この質問を見てMATLABを使用している人は、 'pkg load signal%load packages'という行をコメントアウトして削除してください。 – informaton