I'm trying to produce a sampled piano note and I keep getting the error "Index exceeds matrix dimensions." I'm not sure where i've gone wrong :/
2 views (last 30 days)
Show older comments
%% Part 1: Preparing the signal
[pianosig,Fs]=wavread('piano_A.wav'); %%Imports the piano signal
Length=length(pianosig); %%len = the length of the signal
Duration = Length/Fs; %%the duration of the signal is length divided by the sampling frequency
Ts=1/Fs; %%sampling time is 1 divided by the sampling frequency
Time=0:Ts:Duration-Ts; %%makes samples at set intervals
plot(Time,pianosig);xlabel('time (sec)'); %%plots the signal on a graph, x label is time in seconds
ylabel('Amplitude');title('Piano A time domain'); %%y label is amplitude
sptool %%View the spectrum information
sound(pianosig,Fs) %%play signal
%%Part 2: Harmonic Content
% Harmonics Frequency(Hz) Magnitude(dB)
% 1st 441 -34
% 2nd 880 -38
% 3rd 1325 -47
% 4th 1770 -50
% 5th 2222 -61
% 6th 2680 -70
% 7th 3144 -72
% 8th 3609 -86
% 9th 4087 -94
% 10th 4587 -103
% 11th 5069 -99
% 12th 5999 -92
% 13th 6999 -94
% 14th 7999 -96
% 15th 9000 -96
% 16th 10000 -98
% 17th 11000 -98
% 18th 12000 -101
%%Part 2: Creating the envelope
Temp = pianosig.^2;
plot(Temp);
d = fdesign.lowpass(40,100,1,80,44100);
Lowpass=design(d,'kaiserwin');
Envelope=filter(Lowpass,Temp);
plot(Envelope);
%%Part 3: Creating the sampled signal
Frequencies = [441, 880, 1325,1770, 2222, 2680, 3144, 3609, 4087, 4587, 5069, 5999, 6999, 7999, 9000, 10000, 11000, 12000];
Magnitude = [-34, -38, -47, -50, -61, -70, -72, -86, -94, -103, -99, -92, -94, -96, -96, -98, -98, -101];
Magnitude = db2mag(Magnitude); %%converts dB to magnitude values
Signal=0;
for i = 1:length(Frequencies) %%creating sine waves and adding them together
Signal = Signal+Magnitude(i)*sin(Frequencies(i)*2*pi*Time);
end
SynthSignal = Signal(1:length(Envelope)).*Envelope; %%applies envolope as a guide
SynthSignal=SynthSignal./max(abs(SynthSignal)); %%Normalises the signal
plot(SynthSignal);
sound(SynthSignal,Fs);
0 Comments
Answers (1)
Wayne King
on 18 Feb 2014
Edited: Wayne King
on 18 Feb 2014
Without commenting on your code, the following should fix your problem
for i = 1:length(Frequencies)
Signal = Signal+Magnitude(i)*sin(Frequencies(i)*2*pi*Time);
end
Signal = Signal(:);
SynthSignal = Signal(1:length(Envelope)).*Envelope; %%applies envolope
Note that I have inserted
Signal = Signal(:);
after your for loop exits.
0 Comments
See Also
Categories
Find more on Spectral Measurements in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!