WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Speicherproblem beim abbrechen einer For-Schleife

 

Frei87

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.04.2016, 11:01     Titel: Speicherproblem beim abbrechen einer For-Schleife
  Antworten mit Zitat      
Hallo liebes Forum!

Aktuell habe ich folgendes Problem:

Ich habe ein Player programmiert, mit dem ich ein Signal abspielen aber auch beim Abspielen unterbrechen möchte. Beides wird über einen Pushbutton realisiert. Wenn ich den Pushbutton zum abspielen tätige, dann funktioniert alles problemlos. Sobald ich aber über den gleichen Pushbutton das Signal abbrechen möchte wird mir eine Fehlermeldung ausgegeben, die besagt, dass der Arbeitsspeicher voll ist. Ich weiß gerade nicht wo ich ansetzen soll, um den Fehler zu beheben. Vielleicht kann mir jemand weiterhelfen.

Im Folgenden der Code:


Code:
% Pushbutton Play/Stop

% --- Executes on button press in pushbutton_start.
function pushbutton_start_Callback(hObject, eventdata, handles)
% hObject    handle to pushbutton_start (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

% global variable
global Duration ListValue Counter
global speakerIndex stimulusFileName
global ChanCorr OutChannels DeviceID
global BasePath filePath
global calibrationLevel stimulusLevel
global SampleRate
global BitSize
global Startbutton

if Startbutton == 0
    set(handles.pushbutton_start, 'String', 'Stop');
    Startbutton = 1;
else
    set(handles.pushbutton_start, 'String', 'Start');
    Startbutton = 0;
end

% First generate a Signal File
if isempty(Counter) == 1
    Counter = 1;
     
    % generate stimulusFileName for wavwrite
    stimulusFileName = 'Signal.wav';
    % generate filePath for play wavfile
    filePath = strcat(BasePath, filesep, stimulusFileName);
end

% Get the correct Signal
[GetSignal_Status Signal] = getSignal(Duration, ListValue);

% Query, if everything is in order. It will only continue to run if there
% is no error!
if GetSignal_Status == 1
    % Write Wavfile
    wavwrite(Signal,SampleRate,BitSize,stimulusFileName);

    % Present Signal
    presentCalibSignal(filePath, speakerIndex, calibrationLevel, stimulusLevel, ChanCorr, OutChannels, DeviceID)
    set(handles.pushbutton_start, 'String', 'Start');
end

%-------------------------------------------------------------------------------

% Code aus der presentCalibSignal-function:

%% global variable
global SampleRate
global BlockLen
global Startbutton

% In case that MSOUND should still be open, MSOUND will be closed
msound( 'close');


%% Read WavSamples
[y,fs] = wavread(filePath);

%% Make from Stereo-Signal a Mono-Signal
   if size(y,2)==2
       y = y(:,2);
   end
   
RMS_before  = rms(y,1);
dBFS_before = 20*log10(RMS_before);

%% Scale to correct Level
y = y* (10^((stimulusLevel-(80-calibrationLevel)) / 20));

RMS_after  = rms(y,1);
dBFS_after = 20*log10(RMS_after);

MaxRMS   = max(abs(y));
dBFS_MAX = 20*log10(MaxRMS);

%% Warning for distortion
if dBFS_before<dBFS_after || dBFS_MAX>0
     msgDistortion = errordlg('Die Amplitude des Signals ist größer als im Originalzustand! Aus Sicherheitsgründen wird das Signal nicht abgespielt', 'ACHTUNG', 'modal');
     uiwait(msgDistortion);
     dBFS_before
     dBFS_after
     dBFS_MAX
else

    NrofSamples = size(y,1);
    % number of complete frames in signal
    NrofBlocks  = floor(NrofSamples/BlockLen);  

    %% Zero Padding    
    % Number of missing samples
    restBlockLen = mod(NrofSamples, BlockLen);

    % padding code
    if restBlockLen >0
    %     oldBlocks = NrofSamples / BlockLen;

            missSamples = zeros(BlockLen - restBlockLen,1);
            y = cat(1,y,missSamples);

    %     newBlocks = length(y) / BlockLen;
    end


    %% Create a Matrix with number of Samples and number of all Device-Channels
    SignalMatrix = zeros(size(y,1), OutChannels);


    %% Play Signal
    % Check for available output channels
    if speakerIndex+ChanCorr > OutChannels
        msgString = ['Die ausgewählte Soundkarte verfügt nur über ', num2str(OutChannels),...
                    ' Ausgangskanäle! Die Ansteuerung des Ausgangkanals ', num2str(speakerIndex+ChanCorr),...
                    ' ist nicht möglich! Bitte passen Sie die Eingabe für Lautsprecher und ggf. in der ChanCorr.xls Datei an. Die Anwendung muss neu gestartet werden!'];
        msgChannelError = errordlg(msgString, 'Fehler', 'modal');
        uiwait(msgChannelError);
    else
            % Paste Mono-signal into the correct column
            SignalMatrix(:,speakerIndex+ChanCorr) = y;
               
            % Open msound devices for reading and writing
            msound('openWrite', DeviceID, SampleRate, BlockLen, OutChannels)

            % try that to see some more info about what msound is doing
            % msound('verbose', 1)

            for k=1:NrofBlocks
                drawnow;
                if Startbutton == 0
                    SignalMatrix = [];
                    break;
                end
                % sample indices for next frame:
                idx = (k-1)*BlockLen + (1:BlockLen);
                msound('putSamples', SignalMatrix(idx,:));
            end
            Startbutton = 0;    

            % Close msound
            msound('close');
    end

end

 



Folgender Fehler wird ausgegeben, wenn das Signal durch den Pushbutton abgebrochen wird:

Error using zeros
Out of memory. Type HELP MEMORY for your options.

Error in presentCalibSignal (line 7Cool
SignalMatrix = zeros(size(y,1), OutChannels);

Error in SignalPlayer>pushbutton_start_Callback (line 398)
presentCalibSignal(filePath, speakerIndex, calibrationLevel,
stimulusLevel, ChanCorr, OutChannels, DeviceID)

Error in gui_mainfcn (line 96)
feval(varargin{:});

Error in SignalPlayer (line 42)
gui_mainfcn(gui_State, varargin{:});

Error in
@(hObject,eventdata)SignalPlayer('pushbutton_start_Callback',hObject,eventdata,guidata(hObject))


Error while evaluating uicontrol Callback


Frei87

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.04.2016, 11:35     Titel:
  Antworten mit Zitat      
Ich habe den Fehler selbst gefunden. Und zwar habe ich den Callback-Code für den Pushbutton ungünstig geschrieben. In der alten Version ist Matlab den gesamten Code ab dem Callback durchgegangen und hat somit das doppelte an Daten angelegt (zumindest temporär). Der Callback-Code sollte aber so aussehen:

Code:

% Pushbutton Play/Stop

% global variable
global Duration ListValue Counter
global speakerIndex stimulusFileName
global ChanCorr OutChannels DeviceID
global BasePath filePath
global calibrationLevel stimulusLevel
global SampleRate
global BitSize
global Startbutton

% First generate a Signal File
if isempty(Counter) == 1
    Counter = 1;
     
    % generate stimulusFileName for wavwrite
    stimulusFileName = 'Signal.wav';
    % generate filePath for play wavfile
    filePath = strcat(BasePath, filesep, stimulusFileName);
end

if Startbutton == 0
    set(handles.pushbutton_start, 'String', 'Stop');
    Startbutton = 1;
    % Get the correct Signal
    [GetSignal_Status Signal] = getSignal(Duration, ListValue);

    % Query, if everything is in order. It will only continue to run if there
    % is no error!
    if GetSignal_Status == 1
        % Write Wavfile
        wavwrite(Signal,SampleRate,BitSize,stimulusFileName);

        % Present Signal
        presentCalibSignal(filePath, speakerIndex, calibrationLevel, stimulusLevel, ChanCorr, OutChannels, DeviceID)
        set(handles.pushbutton_start, 'String', 'Start');
    end
else
    set(handles.pushbutton_start, 'String', 'Start');
    Startbutton = 0;
end

 


Das heißt die Abspiel-Funktion (presentCalibSignal.m) sollte nur einmal aufgerufen werden und zwar wenn der Pushbutton zum Abspielen betätigt wurde. Beim Anhalten des Signals muss die Abspiel-Funktion (presentCalibSignal.m) nicht nochmal durchlaufen werden, was selbst erklärend ist.

Trotzdem vielen Dank für die Möglichkeit etwas zu posten Wink
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum posten
Du kannst Dateien in diesem Forum herunterladen
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2025 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.