-
Notifications
You must be signed in to change notification settings - Fork 1
/
part1_6.m
73 lines (61 loc) · 1.58 KB
/
part1_6.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
% 6. Bonus: Pattern Finder
% read the audio
song = fullfile('C:\','Users','frankie','Desktop','COMP90072','assignment1','imperial_march.wav');
[y,Fs] = audioread(song);
% plot the original sound (search region)
subplot(2,1,1)
t1 = (0:length(y)-1)/Fs;
plot(t1,y)
title('original sound')
xlabel('Time (s)')
% transpose to make it a vector
y = transpose(y);
template = zeros(1,length(y));
template(1:10000) = y(50001:60000);
% plot the template sound
subplot(2,1,2)
t2 = (0:length(template)-1)/Fs;
plot(t2,template)
title('template sound')
xlabel('Time (s)')
% get the length of r
lengtha = length(template);
lengthb = length(y);
l = lengtha+lengthb-1;
% correlation using FFT
r = ifft(fft(template,l).*conj(fft(y,l)));
r = fftshift(r);
% generate lag vector
lag = zeros(1,length(y)*2+1);
init = length(y)*(-1);
for i = 1:(length(y)*2+1)
lag(i) = init + i - 1;
end
% Use the plot to find the high points (split value) at about 15-20.
figure
plot(r)
xlabel('Index')
ylabel('Correlation value')
% initialize the index vector
I=[];
% try 16 to find the occurrences here
for i = 1:length(r)
if (abs(r(i)) > 16)
I = [I i];
end
end
% Show the resulting correlation vector and then line up the occurrences of the element on a plot of the
% signal (x-axis: time, y-axis: frequency)
figure
y = zeros(1,length(y));
plot(t1,y)
title('sound')
xlabel('Time (s)')
ylabel('Frequency')
for i = 1:length(I)
hold on;
% get the lag of index
lagDiff = lag(I(i));
timeDiff = lagDiff/Fs;
plot(timeDiff*(-1), 1.0,'r*');
end