Difference between revisions of "Mus320"

From CCRMA Wiki
Jump to: navigation, search
(Common Matlab Trickiness (Please feel free to add additional hints!))
([Home http://ccrma.stanford.edu/courses/320/])
 
(3 intermediate revisions by the same user not shown)
Line 16: Line 16:
  
  
* When using built in functions such as min and max, be careful note to which dimension the operator is working on.  Typically, matlab operators on columns.
+
* When using built in functions such as min and max, be careful note to which dimension the operator is working on.  Typically, matlab operators work on columns.
  
  
 
* The transpose operator ' (apostrophe) acts as a Hermitian transpose.  The Hermitian transpose takes the complex conjugate as well as the normal transpose of a matrix.  To take avoid taking the complex conjugate you can use .' (I'm guessing we will usually use the Hermitian transpose).
 
* The transpose operator ' (apostrophe) acts as a Hermitian transpose.  The Hermitian transpose takes the complex conjugate as well as the normal transpose of a matrix.  To take avoid taking the complex conjugate you can use .' (I'm guessing we will usually use the Hermitian transpose).
  
 +
==[Home http://ccrma.stanford.edu/courses/320/]==
  
http://ccrma.stanford.edu/courses/320/
+
==Matlab Demo Code==
 +
%% General matlab stuff
 +
 
 +
 
 +
 
 +
%% Scalars
 +
% scalars: real and imaginary
 +
 
 +
% angle, abs, sin, exp
 +
 
 +
% Simple Operators
 +
 
 +
% Simple math functions
 +
 
 +
 
 +
%% vectors
 +
 
 +
% Functions of vectors: min, max, sum
 +
 
 +
% concatenate vectors with [] row wise of ; for column wise
 +
 
 +
% Simple generators of vectors: zeros, ones, randn
 +
 
 +
% How to make a sine wave: calling function
 +
 
 +
    s440 = sinGen(440, fs, fs);
 +
   
 +
    sound(s440, fs);
 +
   
 +
% AM modulation-> using the .*
 +
% AM: phone call
 +
    am = sinGen(440, fs, fs).*sinGen(25, fs, fs);
 +
    sound(am,fs)
 +
 
 +
 
 +
% FM: more crazy -> using the .*
 +
    t = 0:2*fs;
 +
    fc = sin(2*pi*200*t/fs);
 +
    fm = sin(2*pi.*fc.*t/fs);
 +
 
 +
 
 +
%% Matrix
 +
 
 +
    m = [1 2 3; 4 5 6; 7 8 9];
 +
 
 +
% How to define matrices: stereo sine wave with two different frequecies
 +
 
 +
    s880 = .8*sqrGen(880, fs, fs);
 +
   
 +
    sound(s880, fs);
 +
   
 +
   
 +
    ss = [ s440 s880 ];
 +
   
 +
   
 +
    sound(ss, fs);
 +
 
 +
% Matrix multiplication: mixing the left and right signals together
 +
 
 +
    mixer = [0 1; 1 0];
 +
 
 +
    mixed = ss*mixer;
 +
   
 +
    sound(mixed, fs);
 +
 
 +
% Functions on vectors and matrices: operate on columns
 +
 
 +
% min and max, etc
 +
 
 +
 
 +
 
 +
%% Creating functions
 +
% -> take a look at a pre-made function (sinGen)
 +
 
 +
% -> make a function (sqrGen) using sign
 +
 
 +
% functions can return more than one parameter
 +
 
 +
 
 +
% Plotting, Lets plot something more fun, a smiley face!
 +
 
 +
    % Create the head
 +
    theta = 0:.01:2*pi;
 +
    r = 1.0;
 +
    x = r*cos(theta);
 +
    y = r*sin(theta);
 +
 
 +
    plot(x, y)
 +
 
 +
    % Create the eyes
 +
   
 +
    hold on;
 +
    plot([-.5 .5], [.5 .5], 'o')
 +
 
 +
    % Make eye's bigger
 +
    plot([-.5 .5], [.5 .5], 'x', 'MarkerSize', 14, 'LineWidth', 5)
 +
 
 +
    % Make smile
 +
    t = -.5:.01:.5
 +
    smile = -cos(2*t)+.25;
 +
    plot(t, smile, 'r', 'LineWidth', 5)
 +
   
 +
   
 +
   
 +
Control Statements 
 +
 +
t = -.5:.01:.5
 +
% Animate the smile with if statement
 +
    dead = 0;
 +
 
 +
    for i=1:30
 +
 
 +
        plot(x, y, 'LineWidth', 5)
 +
        hold on;
 +
 
 +
        % Create the eyes
 +
        if(dead==1)
 +
            plot([-.5 .5], [.5 .5], 'x', 'MarkerSize', 14, 'LineWidth', 5)
 +
        else
 +
            plot([-.5 .5], [.5 .5], '+', 'MarkerSize', 14, 'LineWidth', 5)
 +
        end
 +
 
 +
        % Make smile
 +
        smile = -.1*cos(2*t)-.25;
 +
        plot(t,smile, 'r', 'LineWidth', 5)
 +
 
 +
        pause(.2);
 +
        hold off;
 +
 
 +
    end
 +
 
 +
 
 +
 
 +
%% Loading Audio!
 +
 
 +
clear all; close all; clc;
 +
 
 +
% Load the wave file
 +
% make sure the file you load is in the same folder as its longer than 3
 +
% seconds
 +
    [audioClip, fs] = wavread('nameOfAudioFile');
 +
 
 +
% Listen!
 +
    sound(audioClip,fs);
 +
 
 +
% Plot
 +
    plot(audioClip)
 +
 
 +
% Shorten the clip
 +
    shortClip = audioClip(1:2.75*fs);
 +
 
 +
% Listen!
 +
    sound(shortClip, fs);
 +
 
 +
% Listen Slow!
 +
    sound(shortClip);
 +
 
 +
% Plot
 +
    plot(shortClip)
 +
 
 +
% Create time axis
 +
    time = 0:length(shortClip)-1;
 +
    time = time/fs;
 +
 
 +
% Plot with seconds as the axis
 +
    plot(time, shortClip)
 +
 
 +
 
 +
    xlabel('time (sec)')
 +
    ylabel('amplitude')
 +
    title('popping bottles, by Birdman feat. Lil Wayne')
 +
    grid on;
 +
 
 +
% Put amplitude envelop
 +
 
 +
% ramp up for 1/2 second
 +
    rampUp = linspace(0, 1, fs/2);
 +
 
 +
% ramp down for 1 second
 +
    rampDown = linspace(1, 0, fs);
 +
 
 +
% Transpose ramps
 +
    rampUp = rampUp';
 +
    rampDown = rampDown';
 +
 
 +
 
 +
% create envelop signal
 +
    env = [rampUp ; ones(length(shortClip)-length(rampUp)- length(rampDown), 1); rampDown];
 +
 
 +
% apply envelop
 +
    sig = shortClip.*env;
 +
 
 +
% Plot both!
 +
    plot(sig)
 +
    hold on;
 +
    plot(env, 'r')
 +
    legend('Signal', 'Env')
 +
 
 +
 
 +
% There's a swear word, so we need to bleep it out
 +
 
 +
% create a sine wave
 +
    fo = 440;
 +
    t = 1:fs/3;
 +
    bleep = sin(2*pi*fo*t/fs);
 +
 
 +
    sound(bleep,fs)
 +
 
 +
 
 +
% "Clean" the signal
 +
    clean = sig;
 +
    clean(1.2*fs:(1.2*fs + length(bleep) -1)) = bleep;
 +
 
 +
    sound(clean, fs)
 +
 
 +
% bleep is too loud, scale it down
 +
 
 +
    clean(1.2*fs:(1.2*fs + length(bleep) -1 )) = .5*bleep;
 +
    sound(clean, fs)

Latest revision as of 11:25, 1 October 2009

HW 1 FAQ

  • Question #1, etc


Common Matlab Trickiness (Please feel free to add additional hints!)

  • In matlab, vector and matrix indices start at 1 (not 0). For example, to access the first element in the vector x, use x(1). If you are familiar with other programming languages such as C or C++, this might cause some slight difficulties in the beginning.


  • Sound I/O on matlab is pretty basic. For the linux machines, audio will sometimes be a problem if: a web browser is playing audio, JACK is running, some other audio program is locking the audio resources on your computer.


  • When writing functions, the name of the saved file must be the same as the function name.


  • When using built in functions such as min and max, be careful note to which dimension the operator is working on. Typically, matlab operators work on columns.


  • The transpose operator ' (apostrophe) acts as a Hermitian transpose. The Hermitian transpose takes the complex conjugate as well as the normal transpose of a matrix. To take avoid taking the complex conjugate you can use .' (I'm guessing we will usually use the Hermitian transpose).

[Home http://ccrma.stanford.edu/courses/320/]

Matlab Demo Code

%% General matlab stuff


%% Scalars % scalars: real and imaginary

% angle, abs, sin, exp

% Simple Operators

% Simple math functions


%% vectors

% Functions of vectors: min, max, sum

% concatenate vectors with [] row wise of ; for column wise

% Simple generators of vectors: zeros, ones, randn

% How to make a sine wave: calling function

   s440 = sinGen(440, fs, fs);
   
   sound(s440, fs);
   

% AM modulation-> using the .* % AM: phone call

   am = sinGen(440, fs, fs).*sinGen(25, fs, fs);
   sound(am,fs)


% FM: more crazy -> using the .*

   t = 0:2*fs;
   fc = sin(2*pi*200*t/fs);
   fm = sin(2*pi.*fc.*t/fs);


%% Matrix

   m = [1 2 3; 4 5 6; 7 8 9];

% How to define matrices: stereo sine wave with two different frequecies

   s880 = .8*sqrGen(880, fs, fs);
   
   sound(s880, fs);
   
   
   ss = [ s440 s880 ];
   
   
   sound(ss, fs);

% Matrix multiplication: mixing the left and right signals together

   mixer = [0 1; 1 0];
   mixed = ss*mixer;
   
   sound(mixed, fs);

% Functions on vectors and matrices: operate on columns

% min and max, etc


%% Creating functions % -> take a look at a pre-made function (sinGen)

% -> make a function (sqrGen) using sign

% functions can return more than one parameter


% Plotting, Lets plot something more fun, a smiley face!

   % Create the head
   theta = 0:.01:2*pi;
   r = 1.0;
   x = r*cos(theta);
   y = r*sin(theta);
   plot(x, y)
   % Create the eyes
   
   hold on;
   plot([-.5 .5], [.5 .5], 'o')
   % Make eye's bigger
   plot([-.5 .5], [.5 .5], 'x', 'MarkerSize', 14, 'LineWidth', 5)
   % Make smile
   t = -.5:.01:.5
   smile = -cos(2*t)+.25;
   plot(t, smile, 'r', 'LineWidth', 5)
   
   
   
Control Statements   

t = -.5:.01:.5 % Animate the smile with if statement

   dead = 0;
   for i=1:30
       plot(x, y, 'LineWidth', 5)
       hold on;
       % Create the eyes
       if(dead==1)
           plot([-.5 .5], [.5 .5], 'x', 'MarkerSize', 14, 'LineWidth', 5)
       else
           plot([-.5 .5], [.5 .5], '+', 'MarkerSize', 14, 'LineWidth', 5)
       end
       % Make smile
       smile = -.1*cos(2*t)-.25;
       plot(t,smile, 'r', 'LineWidth', 5)
       pause(.2);
       hold off;
   end


%% Loading Audio!

clear all; close all; clc;

% Load the wave file % make sure the file you load is in the same folder as its longer than 3 % seconds

   [audioClip, fs] = wavread('nameOfAudioFile');

% Listen!

   sound(audioClip,fs);

% Plot

   plot(audioClip)

% Shorten the clip

   shortClip = audioClip(1:2.75*fs);

% Listen!

   sound(shortClip, fs);

% Listen Slow!

   sound(shortClip);

% Plot

   plot(shortClip)

% Create time axis

   time = 0:length(shortClip)-1;
   time = time/fs;

% Plot with seconds as the axis

   plot(time, shortClip)


   xlabel('time (sec)')
   ylabel('amplitude')
   title('popping bottles, by Birdman feat. Lil Wayne')
   grid on;

% Put amplitude envelop

% ramp up for 1/2 second

   rampUp = linspace(0, 1, fs/2);

% ramp down for 1 second

   rampDown = linspace(1, 0, fs);

% Transpose ramps

   rampUp = rampUp';
   rampDown = rampDown';


% create envelop signal

   env = [rampUp ; ones(length(shortClip)-length(rampUp)- length(rampDown), 1); rampDown];

% apply envelop

   sig = shortClip.*env;

% Plot both!

   plot(sig)
   hold on;
   plot(env, 'r')
   legend('Signal', 'Env')


% There's a swear word, so we need to bleep it out

% create a sine wave

   fo = 440;
   t = 1:fs/3;
   bleep = sin(2*pi*fo*t/fs);
   sound(bleep,fs)


% "Clean" the signal

   clean = sig;
   clean(1.2*fs:(1.2*fs + length(bleep) -1)) = bleep;
   sound(clean, fs)

% bleep is too loud, scale it down

   clean(1.2*fs:(1.2*fs + length(bleep) -1 )) = .5*bleep;
   sound(clean, fs)