我试图在一个matlab文件中将两个函数连接在一起,它只是说
" function result = DTFMdetect(filenumber),错误:在此上下文中不允许使用函数定义"
当我将2个函数放在单独的文件中并且在另一个文件中调用detectSK
时更早工作的代码,但现在当我尝试将它们组合在一起时,我得到了这个错误。这里有没有人知道它的内容或遇到过它可能会有所帮助吗?
提前致谢
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;
答案 0 :(得分:5)
您需要使用end
关闭所有函数,或者省略所有函数定义中的end
。现在你要混合定义函数的语法(即用end
而不是第二个函数关闭第一个函数)。
在代码中:
% This is valid
function res = main()
res = secondary(1);
function res2 = secondary(i)
res2 = i*2;
和
% This is also valid
function res = main()
res = secondary(1);
end
function res2 = secondary(i)
res2 = i*2;
end
然而:
% 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.
答案 1 :(得分:0)
删除代码行前的end
function detectedSignals=detectSK(data)