无法在同一个matlab文件

时间:2016-05-20 07:51:28

标签: matlab function

我试图在一个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;

2 个答案:

答案 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)