gusucode.com > 声音的处理有:LPC,FFT,共振峰,频谱源码程序 > siganlandsystemusingMatlab/SSUM/library/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))))) % )))))