📄 freqmod.m
字号:
function [signal] = freqmod(num_samples, frequency, freq_ratio, ... amplitude, car_env, mod_env, ix1, ix2, Fs)% Frequency Modulation synthesis %% FREQMOD(num_samples,frequency,freq_skew,amplitude,freq_env,amp_env,partials)%-------------------------------------------------------% MATLAB code created for MAT201a: Signals and Systems% Dr. Jerry Gibson% Copyright University of California, Santa Barbara%-------------------------------------------------------% freqmod.m% This code synthesizes a signal using sinusoids and% separate envelopes for frequency and amplitude.%% Author: Bob L. Sturm 20030825%------------------------------------------------------- % Create envelopes car_envelope = zeros(1,num_samples); mod_envelope = zeros(1,num_samples); % Populate envelopes segment = [0 0]; value = [0 0]; car_env = car_env{:}; for i=1:length(car_env)/2-1, segment(1) = floor(car_env(2*i-1)*num_samples+1); % Start segment(2) = floor(car_env(2*i+1)*num_samples); % End value(1) = car_env(2*i); value(2) = car_env(2*(i+1)); car_envelope(segment(1):segment(2)) = amplitude*0.1* ... linspace(value(1),value(2),segment(2)-segment(1)+1); end %figure %plot(car_envelope); mod_env = mod_env{:}; mod_freq = frequency*freq_ratio; for i=1:length(mod_env)/2-1, segment(1) = floor(mod_env(2*i-1)*num_samples+1); % Start segment(2) = floor(mod_env(2*i+1)*num_samples); % End value(1) = mod_env(2*i); value(2) = mod_env(2*(i+1)); mod_envelope(segment(1):segment(2)) = (ix2-ix1)*mod_freq*0.001* ... linspace(value(1),value(2),segment(2)-segment(1)+1); end %hold on; %plot(mod_envelope,'k'); % Create signal signal = zeros(1,num_samples); modoscil = 0; for i=1:num_samples, % Integrate for FM modoscil = modoscil + (mod_envelope(i)+(ix1*mod_freq))*cos(2*pi*i*mod_freq/Fs); % For some reason divide modoscil by 2... signal(i) = car_envelope(i)*sin(2*pi*(frequency*i/Fs) + modoscil/2); end% HISTORY% Modified from original Common Lisp Music (CLM) code, from CCRMA, Stanford.%; My FM instrument based on Chowning's two-oscillator algorithm%(definstrument fm (start-time duration amplitude freq freq-ratio % &key% (car-env '(0 1 50 .2 100 0))% (car-env-base 1)% (mod-env '(0 1 50 .2 100 0))% (mod-env-base 1)% (mod-index1 0)% (mod-index2 1))% (multiple-value-bind (beg end) (get-beg-end start-time duration)% (let* ((mod-freq (* freq freq-ratio))% (car-osc (make-oscil :frequency freq)) % (mod-osc (make-oscil :frequency mod-freq))% (car-amp (make-env :envelope car-env % :scaler (* amplitude 0.1)% :base car-env-base% :duration duration))% (mod-amp (make-env :envelope mod-env % :scaler (* (- mod-index2 mod-index1) mod-freq .001)% :base mod-env-base% :duration duration)))% (run % (loop for i from beg to end do% (outa i (* (env car-amp) % (oscil car-osc (* (+ (env mod-amp) (* mod-index1 mod-freq))% (oscil mod-osc)))))% )))))
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -