MATLAB Audio GUI: Real-Time Audio Recording and Playback with TCP/IP Communication
function varargout = audio(varargin) % AUDIO MATLAB code for audio.fig % AUDIO, by itself, creates a new AUDIO or raises the existing % singleton*. % % H = AUDIO returns the handle to a new AUDIO or the handle to % the existing singleton*. % % AUDIO('CALLBACK',hObject,eventData,handles,...) calls the local % function named CALLBACK in AUDIO.M with the given input arguments. % % AUDIO('Property','Value',...) creates a new AUDIO or raises the % existing singleton*. Starting from the left, property value pairs are % applied to the GUI before audio_OpeningFcn gets called. An % unrecognized property name or invalid value makes property application % stop. All inputs are passed to audio_OpeningFcn via varargin. % % *See GUI Options on GUIDE's Tools menu. Choose "GUI allows only one % instance to run (singleton)". % % See also: GUIDE, GUIDATA, GUIHANDLES
% Edit the above text to modify the response to help audio
% Last Modified by GUIDE v2.5 11-Oct-2023 21:14:03
% Begin initialization code - DO NOT EDIT gui_Singleton = 1; gui_State = struct('gui_Name', mfilename, ... 'gui_Singleton', gui_Singleton, ... 'gui_OpeningFcn', @audio_OpeningFcn, .... 'gui_OutputFcn', @audio_OutputFcn, ... 'gui_LayoutFcn', [] , ... 'gui_Callback', []); if nargin && ischar(varargin{1}) gui_State.gui_Callback = str2func(varargin{1}); end
if nargout [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:}); else gui_mainfcn(gui_State, varargin{:}); end % End initialization code - DO NOT EDIT end
% --- Executes just before audio is made visible. function audio_OpeningFcn(hObject, eventdata, handles, varargin) % This function has no output args, see OutputFcn. % hObject handle to figure % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) % varargin command line arguments to audio (see VARARGIN)
% Choose default command line output for audio handles.output = hObject; % Update handles structure guidata(hObject, handles); % timer_obj = timer('ExecutionMode', 'fixedRate', 'Period', 0.1, ... % 'TimerFcn', @update_plot); % % % 启动定时器 % start(timer_obj); % UIWAIT makes audio wait for user response (see UIRESUME) % uiwait(handles.figure1); end
% --- Outputs from this function are returned to the command line. function varargout = audio_OutputFcn(hObject, eventdata, handles) % varargout cell array for returning output args (see VARARGOUT); % hObject handle to figure % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA)
% Get default command line output from handles structure varargout{1} = handles.output;
end % --- Executes on button press in button_savedata. % function button_savedata_Callback(hObject, eventdata, handles) % % hObject handle to button_savedata (see GCBO) % % eventdata reserved - to be defined in a future version of MATLAB % % handles structure with handles and user data (see GUIDATA) % global audio_data; % global save_flag; % if(hObject.Value) % save_flag=1; % elseif(hObject.Value==0&&save_flag==1) % save_flag=0; % y=audio_data; % save("recorddata.mat","y"); % % app.sounddata=y; % filenames = dir('recorddata.mat'); % n = numel(filenames); % fs = 44100; % nBits = 16; % for a=1:n % name = filenames(a).name; % name_no = name; % name_no(end-3:end) = []; % d = load(name); % field = fieldnames(d); % audio = getfield(d,char(field)); % audiowrite([name_no,'.wav'],audio,fs,'BitsPerSample',nBits,'Comment',name_no) % a=a+1; % end % end %% % end function button_savedata_Callback(hObject, eventdata, handles) global audio_data; global save_flag; global message_cnt; if hObject.Value save_flag = 1; elseif hObject.Value == 0 && save_flag save_flag = 0; y = audio_data; save("recorddata.mat", "y"); filenames = dir('recorddata.mat'); n = numel(filenames); fs = 44100; nBits = 16; for a = 1:n name = filenames(a).name; name_no = name; name_no(end-3:end) = []; audio = y; audiowrite([name_no, '.wav'], audio, fs, 'BitsPerSample', nBits, 'Comment', name_no) end % str1 = '输入文件名'; % str2 = handles.edittext_FileName.String; % flag = strcmp(str1,str2); % if(flag == 0) % 代表输入了文件名 % fileName = ['./mydata/20/' str2 '.xlsx']; % xlswrite(fileName,audio_data); % set(handles.edittext_FileName,'String',str1); % % % 保存数据成功信息打印 % mystring = 'INFO: 文件已保存!'; % MessageString = handles.listbox_MessagePrint.String; % MessageSize = size(MessageString); % if(MessageSize(1,1) <= 0) % set(handles.listbox_MessagePrint,'Value',1); % set(handles.listbox_MessagePrint,'String',mystring); % elseif(MessageSize(1,1) < message_cnt) % set(handles.listbox_MessagePrint,'Value',MessageSize(1,1)+1); % set(handles.listbox_MessagePrint,'String',[MessageString;{mystring}]); % else % set(handles.listbox_MessagePrint,'Value',message_cnt); % set(handles.listbox_MessagePrint,'String',[MessageString(2:message_cnt,1);{mystring}]); % end % else % % 保存数据失败信息打印 % mystring = 'INFO: 文件未保存-->请输入文件名!'; % MessageString = handles.listbox_MessagePrint.String; % MessageSize = size(MessageString); % if(MessageSize(1,1) <= 0) % set(handles.listbox_MessagePrint,'Value',1); % set(handles.listbox_MessagePrint,'String',mystring); % elseif(MessageSize(1,1) < message_cnt) % set(handles.listbox_MessagePrint,'Value',MessageSize(1,1)+1); % set(handles.listbox_MessagePrint,'String',[MessageString;{mystring}]); % else % set(handles.listbox_MessagePrint,'Value',message_cnt); % set(handles.listbox_MessagePrint,'String',[MessageString(2:message_cnt,1);{mystring}]); % end % end end end
function button_savedata_CreateFcn(hObject, eventdata, handles) global audio_data; audio_data = 0; global save_flag; save_flag = 0; end
function button_tcp_CreateFcn(hObject, eventdata, handles)
global tcp_server_obj
tcp_server_obj = 0;
global receivedData
receivedData = [];
global message_cnt
message_cnt = 0;
global fakedata
fakedata=0;
global realdata
realdata=0;
global realdataflag
realdataflag=0;
global tcp_callback_cnt
tcp_callback_cnt =0;
% global WordLib;
end
% --- Executes on button press in button_tcp.
function button_tcp_Callback(hObject, eventdata, handles)
global tcp_server_obj;
global message_cnt;
RemoteHostIP = handles.edittext_RemoteHostIP.String;
RemoteHostPort = str2num(handles.edittext_RemoteHostPort.String);
if(hObject.Value) % 打开连接
% tcp_server_obj=tcpsever(RemoteHostIP,RemoteHostPort);
% set(tcp_server_obj, 'InputBufferSize', 4);
tcp_server_obj =tcpserver('127.0.0.1', RemoteHostPort);%我电脑的IP127.0.0.1
% tcp_server_obj.BytesAvailableFcnMode = 'byte';
% tcp_server_obj.BytesAvailableFcnCount = 4;
% tcp_server_obj.BytesAvailableFcn = {@TcpServer_callback,handles};
% configureCallback(tcp_server_obj,"byte",2,@TcpServer_callback);%configureCallback(tcp_server_obj,"byte",4,@TcpServer_callback) ;
% PrintMessage(handles,message_cnt,"INFO:等待网络连接");
disp('INFO:等待网络连接');
fopen(tcp_server_obj);
% PrintMessage(handles,message_cnt,"INFO:连接成功!!!");
disp('INFO:连接成功');
fwrite(tcp_server_obj,[16 1]);
configureCallback(tcp_server_obj,"byte",2,@TcpServer_callback);
fwrite(tcp_server_obj,[15 255]);
else % 关闭连接
delete(tcp_server_obj);
end
end
function axes_AudioData_CreateFcn(hObject, eventdata, handles)
end
function TcpServer_callback(obj,event,handles) global audio_data; global save_flag; global receivedData; global tcp_callback_cnt; global fakedata; global realdata; global realdataflag; % global message_cnt; % global MIX_Model; % global MIC_Model; % global WordLib; % hAxes = handles.axes_AudioData;
data = fread(obj,1,'uint16');
% data = char(received_data);
%handles = guidata(obj);
% 更新变量
handles.myVariable = data;
assignin('base', 'myVariable', handles.myVariable);
if(data==0x1001&&tcp_callback_cnt==0)
tcp_callback_cnt=tcp_callback_cnt+1;
fakedata=0;
elseif(tcp_callback_cnt==1)
fakedata=data;
tcp_callback_cnt=tcp_callback_cnt+1;
elseif(tcp_callback_cnt==2&&data==0xffff)
realdata=fakedata;
tcp_callback_cnt=0;
realdataflag=1;
realdata = realdata/(2^16-1)*4.096-2.048; % %%%%%%%%%%%%还没改
fwrite(obj,[15 255]);
else
fwrite(obj,[15 255]);
realdataflag=0;
end
handles.tcp_callback_cnt=tcp_callback_cnt;
handles.realdataflag=realdataflag;
assignin('base', 'tcp_callback_cnt', handles.tcp_callback_cnt);
assignin('base', 'realdataflag', handles.realdataflag);
handles.realdata=realdata;
assignin('base', 'realdata', handles.realdata);
handles.fakedata=fakedata;
assignin('base', 'fakedata', handles.fakedata);
% notify(handles, 'VariableChanged');
flag=realdataflag;
% 更新句柄结构
if any(save_flag>0.5)
if any(flag>0.5)
audio_data=[audio_data;realdata];
end
end
if any(flag>0.5)
disp('画图');
handles.axes_AudioData =obj;
hAxes = handles.axes_AudioData;
realdataflag=0;
receivedData = [receivedData; realdata];
plot(hAxes, receivedData);
xlim(hAxes, [max(1, size(receivedData, 1) - 8000), size(receivedData, 1)]);
end
handles.receivedData=receivedData;
assignin('base', 'receivedData', handles.receivedData);
end
% function myCallback2(~, eventdata)
% global realdataflag;
% if(realdataflag==1)
% disp('画图');
% hAxes = handles.axes_AudioData;
% receivedData = [receivedData; realdata];
% plot(hAxes, receivedData);
% realdataflag=0;
% xlim(hAxes, [max(1, size(receivedData, 1) - 8000), size(receivedData, 1)]);
% end
% end
% hObject handle to button_tcp (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% Hint: get(hObject,'Value') returns toggle state of button_tcp
function figure1_CloseRequestFcn(hObject, eventdata, handles) global tcp_server_obj; % Hint: delete(hObject) closes the figure delete(hObject); if(isempty(tcp_server_obj) == 1 ) fclose(tcp_server_obj); % 防止在接收过程中关闭GUI,造成tcp server对象未关闭 delete(tcp_server_obj); end
clear tcp_server_obj;
delete(instrfindall);
end
function edittext_LocalHostIP_Callback(hObject, eventdata, handles) end function edittext_LocalHostIP_CreateFcn(hObject, eventdata, handles) if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) set(hObject,'BackgroundColor','white'); end set(hObject,'String','192.168.43.37'); end
function edittext_LocalHostPort_Callback(hObject, eventdata, handles) end function edittext_LocalHostPort_CreateFcn(hObject, eventdata, handles)
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
set(hObject,'String','1234');
end
function edittext_RemoteHostIP_Callback(hObject, eventdata, handles) end function edittext_RemoteHostIP_CreateFcn(hObject, eventdata, handles) if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) set(hObject,'BackgroundColor','white'); end set(hObject,'String','192.168.43.37'); end
function edittext_RemoteHostPort_Callback(hObject, eventdata, handles) end function edittext_RemoteHostPort_CreateFcn(hObject, eventdata, handles) if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) set(hObject,'BackgroundColor','white'); end set(hObject,'String','8888'); end
% --- Executes during object creation, after setting all properties.
% --- Executes on button press in pushbutton_PlayAudio. function pushbutton_PlayAudio_Callback(hObject, eventdata, handles) % hObject handle to pushbutton_PlayAudio (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) load recorddata.mat y; %y=app.sounddata; Fs=44100; % assignin('base','y',y); % assignin('base','Fs',Fs); whos y Fs; player = audioplayer(y,Fs); play(player); end
% --- Executes during object creation, after setting all properties. function figure1_CreateFcn(hObject, eventdata, handles) end function text1_CreateFcn(hObject, eventdata, handles) end
% --- Executes during object creation, after setting all properties.
% hObject handle to axes_AudioData (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles empty - handles not created until after all CreateFcns called
% Hint: place code in OpeningFcn to populate axes_AudioData 警告: 执行为类 matlabshared.asyncio.internal.InputStream 定义的事件 DataWritten 的侦听程序回调时出现错误:
错误使用 plot
数据必须为可转换为双精度值的数值、日期时间、持续时间、分类或数组。 怎么改内容:根据错误消息 "错误使用 plot 数据必须为可转换为双精度值的数值、日期时间、持续时间、分类或数组",我注意到你尝试使用 plot 函数绘制图形时出现了问题。
要解决这个问题,你可以按照以下步骤进行修改:
-
确保
receivedData是一个双精度数组或者可以转换为双精度值的数据类型。你可以使用class函数来检查数据的类型。例如,输入class(receivedData)来查看receivedData的类型。如果类型不是 double 类型,请确保将其转换为 double 类型的数组。 -
检查
receivedData中是否存在 NaN(非数字)或 Inf(无穷大)等特殊值。这些特殊值可能导致plot函数无法正确绘制图形。你可以使用isnan和isinf函数来检查数据中是否存在这些特殊值,并进行相应的处理。 -
确保
receivedData是一个正确的数组大小和形状。receivedData应该是一个列向量或者矩阵,其中每一列或每一行代表一个数据系列。如果receivedData不是一个列向量或者矩阵,请确保将其转换为相应的形状。
例如,如果你的 receivedData 是一个列向量,那么你可以使用以下代码来绘制图形:
plot(handles.axes_AudioData, receivedData);
其中,handles.axes_AudioData 是你的坐标轴句柄。
请根据你的实际情况修改代码,确保传递给 plot 函数的数据是符合要求的,并处理可能导致问题的特殊值。如果问题仍然存在,请提供更多相关的代码和上下文信息,以便更好地理解问题并提供帮助。
原文地址: http://www.cveoy.top/t/topic/oA6 著作权归作者所有。请勿转载和采集!