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)))))
%          )))))