音源を一周期に切り出​したものを複数回繰り​返した波形に対して一​定周期間隔で周波数を​変化させた正弦波(c​os波なので余弦波)​を乗算しゆらぎを与え​るプログラム

16 views (last 30 days)
taisei kimura
taisei kimura on 4 Feb 2021
Commented: takemoto on 5 Feb 2021
タイトルのようなプログラムを作成しており、正規分布のパラメータから周波数を得て一定周期間隔で正弦波乗算を行いたいのですが繰り返し波形全体に対してパラメータ乗算をしてしまっており一定周期ごとに乗算する方法がわかりません。このプログラムだと繰り返し波形を2秒としており0.1秒ごとに周波数を変化させようと考えています。そのため、正規分布の乱数値を20に設定しその値ごとに乗算するプログラムを実行しグラフをつなげたのですがつなげた場所がずれてしまっているため正弦波の形状はいびつな形になり乗算後の波形はのこぎりのような波形になってしまったのでその方法はあきらめました。
そのためきれいな振幅変調波形を作りたいのですがMATLAB初心者なのでこれ以上考えられません!
力添えお願いします。
%% Read Audio File
[y,Fs]=audioread('piano_ra_2.wav'); % y: 波形, Fs: サンプリング周波数 (Hz)
dt=1/Fs; % サンプリング間隔 (sec)
duration=(length(y))*(1/Fs); % waveファイルの再生時間(T)
time_lis=[1/Fs:1/Fs:duration];
plot(time_lis,y);
set(gca,'FontSize',15);
xlabel('Time (s)','FontSize',25)
ylabel('Relative Amplitude','FontSize',25)
%% Play Audio File
sound(y,Fs);
%% FFT
% abs: 絶対値, anble: 偏角
ft_y=fft(y);
df=1/duration;
freq_lis=[1/Fs:df:df*(length(ft_y))];
figure;
plot(freq_lis,abs(ft_y));
xlim([0 11025]);
set(gca,'FontSize',15);
xlabel('Frequency (Hz)','FontSize',25)
ylabel('Relative Amplitude','FontSize',25)
%% Cut Waveform
f0=439.8; % 基本周波数 (Hz)
period=1/f0; % 周期 (sec)
n0=floor(length(y)/2); % 何サンプル目から取り出すか?
n=round(period/dt); % 何サンプル分を取り出すか?
y_one_period=y([n0:n0+n]); % 1周期を切り出す
n_period=1000;%繰り返す数
y=repmat(y_one_period,[n_period,1]);
t=(1/Fs:1/Fs:length(y)/Fs);
figure;
plot(t,y);
xlim([0 0.002268])
xticks([])
yticks([])
figure;
plot(t,y);
xlim([0 0.002268])
set(gca,'FontSize',15);
xlabel('Time (s)','FontSize',25)
ylabel('Relative Amplitude','FontSize',25)
%% Copy One Period
n_period_1=860; % 何周期分コピーするか?
y1=repmat(y_one_period,[n_period_1,1]); % 1周期の配列をコピーして繰り返す
t1=(1/Fs:1/Fs:length(y1)/Fs);
figure;
plot(t1,y1);
xlim([0 0.02268])
set(gca,'FontSize',15);
xlabel('Time (s)','FontSize',25)
ylabel('Relative Amplitude','FontSize',25)
%% Play Sound
sound(y1,2*Fs)
%% rand関数を用いた正規分布の作成(平均値と分散)
va=0.8;
r=va.*randn(1000,1)+6.25;
histogram(r);
%% 混合器 LO信号
f_lo=r;
T=1/r;
a=0.9;
y2=repmat(y_one_period,[n_period_1,1]);
t2=1/Fs:1/Fs:43860*(1/Fs);
y_lo=(a*cos(2*pi*r*t2))+1;
figure;
plot(t2,y_lo);
set(gca,'FontSize',15);
xlabel('Time (s)','FontSize',25)
ylabel('Relative Amplitude','FontSize',25)
%% 混合器
y2=y2.';
mix=y2.*y_lo;
figure;
plot(t2,mix);
set(gca,'FontSize',15);
xlabel('Time (s)','FontSize',25)
ylabel('Relative Amplitude','FontSize',25)
  3 Comments
taisei kimura
taisei kimura on 4 Feb 2021
今日中に完成させなければいけないため本当にお願いします!
takemoto
takemoto on 5 Feb 2021
プログラム、ざっと拝見しました。ご質問の意図が把握できていませんが、内容としては、
①ある音源の基本周波数一周期分の取り出す
②①をコピーして2秒分のデータを作成
③6.25を平均としたランダムな周期のcos波を1000個生成
④②と③をミックス
という風に見受けられました。
「つなげた場所がずれてしまう」とのことですが、仮に④のデータを
時間軸方向に結合した際の、不連続な部分をおっしゃっているなら、
そもそも③の信号の始点と終点が、各周波数でばらばらなためでは
ないでしょうか。
連続的に周波数の変化する変調信号がご所望で、Signal Processing Toolboxを
お持ちであれば、以下のchirp関数が使えるかもしれません。
https://jp.mathworks.com/help/signal/ref/chirp.html

Sign in to comment.

Answers (0)

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!