Reputation: 142
I'm trying to join 2 functions together in one matlab file it simply says
"function result = DTFMdetect(filenumber), Error: Function definitions are not permitted in this context"
The code where working earlier when I had the 2 functions in separate files and called detectSK
in the other one, but now when I try to get them together, I get this error. Does anyone here know what it's about or have ran into it and can help maybe?
Thanks in advance
function result = DTMFdetect(filenumber)
%
% Funktion som avkodar DTMF signaler
%
% Funktionen generate_secret_data.p samt DTMFgen.m måste finnas i samma
% filkatalog som denna funktionen (eller i path)
%
% Insignaler
% filenumber = signalfilsnummer (0-99)
%
% Utsignal
% Sträng-array med detekterade symboler
% ex. result(3,2) är 2:a symbolen som detekterades i 3:e signalen
signals = generate_secret_data(filenumber);
for sig_idx = 1:6, % 6 signaler ska analyseras
figure;
plot(signals(:,sig_idx));
signals(:,sig_idx);
detected_symbol = detectSK(signals(:,sig_idx)); % Dålig algoritm som alltid gissar 'A'!
for sym_idx=1:4, % varje signal innehåller 4 symboler
% Här fyller du i din detektionsalgoritm för symbol sym_idx
% i signal sig_idx
%
% signals(:,sig_idx) är signalvektorn med alla 4 symboler
result(sig_idx,sym_idx) = detected_symbol(sym_idx); % tilldela resultat
end
end
end
function detectedSignals=detectSK(data)
% Vårat program delar in inkommande data till en array med signalerna
% uppdelade
%Sedan filtrerar den signalerna med motsvarande bandpassfilter för
%frekvenserna och behåller sådan de frekvenser där den hittade mest data,
%dessa används sedan för att jämföra med vilken symbol kombinationen
%motsvarar. Brus är inte riktigt tagit i beaktning utan vi resonarade att
%in a perfect world så filtreras orelevant brus bort och vi kan med denna
%metod fortfarande få ut rätt data.
% data=DTMFgen('16544',40,40,0.5); %% Läser in data
numberOfTones=(length(data)-320)/640; %%Räknar ut hur många toner det är, tar bort de första 40ms då det verkar vara en väntedel
individualSignals=zeros(numberOfTones,320); %%Variabel för att hålla de olika signalerna
IndividualSymbols=[];
%booleans för att hålla värdena för hittade frekvenser
B1209=false;
B1336=false;
B1477=false;
B1633=false;
B697=false;
B770=false;
B852=false;
B941=false;
% Forloop som itererar genom signalen för att dela upp den
for i=1:1:numberOfTones
for k=1:1:320;
individualSignals(i,k)=data((320+(i-1)*640)+(k-1));
end
end
for i=1:1:numberOfTones
% 697Hz-Bandpass filter
Fs = 8E+3; Fc1 = 687; Fc2 = 707; Fs1 = Fc1*0.8; Fs2 = Fc2/0.8; Rp = 1; Rs = 20;
[n,Wn] = buttord([Fc1 Fc2]/4000, [Fs1 Fs2]/4000, Rp, Rs);
[b,a] = butter(2*n,Wn);
[sos,g] = tf2sos(b,a);
data697=filtfilt(sos,g,individualSignals(i,:));%filtrerar datan
N=length(data697);%längden på signalen
Y=fft(data697);%fft:ar den
P2=abs(Y);%hela spektrumet (negativa OCH positiva)
P1=P2(1:N/2+1);%ser till att vi endast tittar för positiva frekvenser
P1(2:end-1)=2*P1(2:end-1);%gångrar den med 2?
f=8000*(0:(N/2))/N;%definerar frekvensspektrumet
value697=sum(P1);
% 770Hz-Bandpass filter
Fs = 8E+3; Fc1 = 760; Fc2 = 780; Fs1 = Fc1*0.8; Fs2 = Fc2/0.8; Rp = 1; Rs = 20;
[n,Wn] = buttord([Fc1 Fc2]/4000, [Fs1 Fs2]/4000, Rp, Rs);
[b,a] = butter(2*n,Wn);
[sos,g] = tf2sos(b,a);
data770=filtfilt(sos,g,individualSignals(i,:));
N=length(data770);%längden på signalen
Y=fft(data770);%fft:ar den
P2=abs(Y);%hela spektrumet (negativa OCH positiva)
P1=P2(1:N/2+1);%ser till att vi endast tittar för positiva frekvenser
P1(2:end-1)=2*P1(2:end-1);%gångrar den med 2?
f=8000*(0:(N/2))/N;%definerar frekvensspektrumet
value770=sum(P1);
% 852Hz-Bandpass filter
Fs = 8E+3; Fc1 = 842; Fc2 = 862; Fs1 = Fc1*0.8; Fs2 = Fc2/0.8; Rp = 1; Rs = 20;
[n,Wn] = buttord([Fc1 Fc2]/4000, [Fs1 Fs2]/4000, Rp, Rs);
[b,a] = butter(2*n,Wn);
[sos,g] = tf2sos(b,a);
data852=filtfilt(sos,g,individualSignals(i,:));
N=length(data852);%längden på signalen
Y=fft(data852);%fft:ar den
P2=abs(Y);%hela spektrumet (negativa OCH positiva)
P1=P2(1:N/2+1);%ser till att vi endast tittar för positiva frekvenser
P1(2:end-1)=2*P1(2:end-1);%gångrar den med 2?
f=8000*(0:(N/2))/N;%definerar frekvensspektrumet
value852=sum(P1);
% 941Hz-Bandpass filter
Fs = 8E+3; Fc1 = 931; Fc2 = 951; Fs1 = Fc1*0.8; Fs2 = Fc2/0.8; Rp = 1; Rs = 20;
[n,Wn] = buttord([Fc1 Fc2]/4000, [Fs1 Fs2]/4000, Rp, Rs);
[b,a] = butter(2*n,Wn);
[sos,g] = tf2sos(b,a);
data941=filtfilt(sos,g,individualSignals(i,:));
N=length(data941);%längden på signalen
Y=fft(data941);%fft:ar den
P2=abs(Y);%hela spektrumet (negativa OCH positiva)
P1=P2(1:N/2+1);%ser till att vi endast tittar för positiva frekvenser
P1(2:end-1)=2*P1(2:end-1);%gångrar den med 2?
f=8000*(0:(N/2))/N;%definerar frekvensspektrumet
value941=sum(P1);
% 1209Hz-Bandpass filter
Fs = 8E+3; Fc1 = 1199; Fc2 = 1219; Fs1 = Fc1*0.8; Fs2 = Fc2/0.8; Rp = 1; Rs = 20;
[n,Wn] = buttord([Fc1 Fc2]/4000, [Fs1 Fs2]/4000, Rp, Rs);
[b,a] = butter(2*n,Wn);
[sos,g] = tf2sos(b,a);
data1209=filtfilt(sos,g,individualSignals(i,:));
N=length(data1209);%längden på signalen
Y=fft(data1209);%fft:ar den
P2=abs(Y);%hela spektrumet (negativa OCH positiva)
P1=P2(1:N/2+1);%ser till att vi endast tittar för positiva frekvenser
P1(2:end-1)=2*P1(2:end-1);%gångrar den med 2?
f=8000*(0:(N/2))/N;%definerar frekvensspektrumet
value1209=sum(P1);
% 1336Hz-Bandpass filter
Fs = 8E+3; Fc1 = 1326; Fc2 = 1346; Fs1 = Fc1*0.8; Fs2 = Fc2/0.8; Rp = 1; Rs = 20;
[n,Wn] = buttord([Fc1 Fc2]/4000, [Fs1 Fs2]/4000, Rp, Rs);
[b,a] = butter(2*n,Wn);
[sos,g] = tf2sos(b,a);
data1336=filtfilt(sos,g,individualSignals(i,:));
N=length(data1336);%längden på signalen
Y=fft(data1336);%fft:ar den
P2=abs(Y);%hela spektrumet (negativa OCH positiva)
P1=P2(1:N/2+1);%ser till att vi endast tittar för positiva frekvenser
P1(2:end-1)=2*P1(2:end-1);%gångrar den med 2?
f=8000*(0:(N/2))/N;%definerar frekvensspektrumet
value1336=sum(P1);
% 1477Hz-Bandpass filter
Fs = 8E+3; Fc1 = 1467; Fc2 = 1487; Fs1 = Fc1*0.8; Fs2 = Fc2/0.8; Rp = 1; Rs = 20;
[n,Wn] = buttord([Fc1 Fc2]/4000, [Fs1 Fs2]/4000, Rp, Rs);
[b,a] = butter(2*n,Wn);
[sos,g] = tf2sos(b,a);
data1477=filtfilt(sos,g,individualSignals(i,:));
N=length(data1477);%längden på signalen
Y=fft(data1477);%fft:ar den
P2=abs(Y);%hela spektrumet (negativa OCH positiva)
P1=P2(1:N/2+1);%ser till att vi endast tittar för positiva frekvenser
P1(2:end-1)=2*P1(2:end-1);%gångrar den med 2?
f=8000*(0:(N/2))/N;%definerar frekvensspektrumet
value1477=sum(P1);
% 1633Hz-Bandpass filter
Fs = 8E+3; Fc1 = 1623; Fc2 = 1643; Fs1 = Fc1*0.8; Fs2 = Fc2/0.8; Rp = 1; Rs = 20;
[n,Wn] = buttord([Fc1 Fc2]/4000, [Fs1 Fs2]/4000, Rp, Rs);
[b,a] = butter(2*n,Wn);
[sos,g] = tf2sos(b,a);
data1633=filtfilt(sos,g,individualSignals(i,:));
N=length(data1633);%längden på signalen
Y=fft(data1633);%fft:ar den
P2=abs(Y);%hela spektrumet (negativa OCH positiva)
P1=P2(1:N/2+1);%ser till att vi endast tittar för positiva frekvenser
P1(2:end-1)=2*P1(2:end-1);%gångrar den med 2?
f=8000*(0:(N/2))/N;%definerar frekvensspektrumet
value1633=sum(P1);
big=sort([value1209 value1336 value1477 value1633]);
small=sort([value697 value770 value852 value941]);
if value1209==big(4)
B1209=true;
else B1209=false;
end
if value1336==big(4)
B1336=true;
else B1336=false;
end
if value1477==big(4)
B1477=true;
else B1477=false;
end
if value1633==big(4)
B1633=true;
else B1633=false;
end
if value697==small(4)
B697=true;
else B697=false;
end
if value770==small(4)
B770=true;
else B770=false;
end
if value852==small(4)
B852=true;
else B852=false;
end
if value941==small(4)
B941=true;
else B941=false;
end
% Kollar vilka siffror det motsvarar
if B1209 & B697
Digit1=true;
else
Digit1=false;
end
if B1209 & B770
Digit4=true;
else
Digit4=false;
end
if B1209 & B852
Digit7=true;
else
Digit7=false;
end
if B1209 & B941
DigitStar=true;
else
DigitStar=false;
end
if B1336 & B697
Digit2=true;
else
Digit2=false;
end
if B1336 & B770
Digit5=true;
else
Digit5=false;
end
if B1336 & B852
Digit8=true;
else
Digit8=false;
end
if B1336 & B941
Digit0=true;
else
Digit0=false;
end
if B1477 & B697
Digit3=true;
else
Digit3=false;
end
if B1477 & B770
Digit6=true;
else
Digit6=false;
end
if B1477 & B852
Digit9=true;
else
Digit9=false;
end
if B1477 & B941
DigitSharp=true;
else
DigitSharp=false;
end
if B1633 & B697
DigitA=true;
else
DigitA=false;
end
if B1633 & B770
DigitB=true;
else
DigitB=false;
end
if B1633 & B852
DigitC=true;
else
DigitC=false;
end
if B1633 & B941
DigitD=true;
else
DigitD=false;
end
if Digit1
individualSymbols(i)='1';
end
if Digit2
individualSymbols(i)='2';
end
if Digit3
individualSymbols(i)='3';
end
if Digit4
individualSymbols(i)='4';
end
if Digit5
individualSymbols(i)='5';
end
if Digit6
individualSymbols(i)='6';
end
if Digit7
individualSymbols(i)='7';
end
if Digit8
individualSymbols(i)='8';
end
if Digit9
individualSymbols(i)='9';
end
if Digit0
individualSymbols(i)='0';
end
if DigitA
individualSymbols(i)='A';
end
if DigitB
individualSymbols(i)='B';
end
if DigitC
individualSymbols(i)='C';
end
if DigitD
individualSymbols(i)='D';
end
if DigitSharp
individualSymbols(i)='#';
end
if DigitStar
individualSymbols(i)='*';
end
end
detectedSignals=individualSymbols;
Upvotes: 1
Views: 158
Reputation: 517
You need to either close all functions with end
or omit the end
from all function definitions. Now you are mixing the syntax for defining functions (i.e. closing the first function with end
but not the second function).
In code:
% This is valid
function res = main()
res = secondary(1);
function res2 = secondary(i)
res2 = i*2;
And:
% This is also valid
function res = main()
res = secondary(1);
end
function res2 = secondary(i)
res2 = i*2;
end
However:
% This is NOT valid
function res = main()
res = secondary(1);
end
function res2 = secondary(i)
res2 = i*2;
Error: File: main.m Line: 9 Column: 1
The function "main" was closed with an 'end', but at least one other function definition was not. To avoid confusion when using nested functions, it is
illegal to use both conventions in the same file.
Upvotes: 5
Reputation: 2132
Remove the end
before the code line
function detectedSignals=detectSK(data)
Upvotes: 0