123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148 |
- function matrixToNSx(varargin)
- % matrixToNSx
- %
- % Converts a MATLAB data matrix (channels as rows, samples as columns) into
- % a NSx file.
- %
- % Use matrixToNSx(inputData, samplingFreq, inputUnits, savedDataPath)
- %
- % All input arguments are optional.
- %
- % inputData: data matrix (channels as rows, samples as columns) into
- % a NSx file.
- %
- % samplingFreq: Sampling frequency of the data. Currently only 500Hz,
- % 1kHz, 2kHz, 10kHz, and 30kHz sampaling frequencies are
- % supported.
- %
- % inputUnits: The unit for the recorded data. Most data acquisition
- % systems save the data in units of µV. TDT units are V.
- % The supported units are V, mV, uV or nV.
- %
- % savedDataPath: The full path (excluding the extension) of the saved
- % file.
- %
- % Example 1 (Mac):
- % matrixToNSx(myData, 30000, 'uv', '/Desktop/newConvertedFile');
- %
- % In the example above, the data matrix myData recorded at 30kHz will be
- % saved on the Desktop (Mac style path) as newConvertedFile.ns5 file.
- %
- % Example 2 (PC):
- % matrixToNSx(myData, 30000, 'uv', 'C:\Data\newConvertedFile');
- %
- % In the example above, the data matrix myData recorded at 30kHz will be
- % saved C:\Data folder as newConvertedFile.ns5 file.
- %
- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- % Kian Torab
- % kian@blackrockmicro.com
- % Blackrock Microsystems
- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- %
- % Version History
- %
- % 1.0.0.0:
- % - Initial release.
- %
- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- switch nargin
- case 0
- disp('Data is a required input.');
- return
- case 1
- disp('Sampling rate and input unit were not provided. Assuming 30kHz and µV.');
- disp('The converted file will be saved on the Desktop.');
- inputData = varargin{1};
- samplingFreq = input('What is the sampling frequency of the recorded data (e.g. ''30000'')? ');
- signalUnit = input('What is the input unit of the signal (V, mV, uV or nV)? ', 's');
- savedFilePath = input('Enter the full path for the converted file? ', 's');
- case 2
- disp('Input unit was not provided. Assuming µV.');
- disp('The converted file will be saved on the Desktop.');
- inputData = varargin{1};
- signalUnit = input('What is the input unit of the signal (V, mV, uV or nV)? ', 's');
- savedFilePath = input('Enter the full path for the converted file? ', 's');
- case 3
- disp('The converted file will be saved on the Desktop.');
- inputData = varargin{1};
- samplingFreq = varargin{2};
- signalUnit = varargin{3};
- savedFilePath = input('Enter the full path for the converted file? ', 's');
- case 4
- inputData = varargin{1};
- samplingFreq = varargin{2};
- signalUnit = varargin{3};
- savedFilePath = varargin{4};
- otherwise
- disp('Invalid number of arguments.');
- return;
- end
- %% Validate sampling frequency
- switch samplingFreq
- case 500
- savedFileExt = '.ns1';
- case 1000
- savedFileExt = '.ns2';
- case 2000
- savedFileExt = '.ns3';
- case 10000
- savedFileExt = '.ns4';
- case 30000
- savedFileExt = '.ns5';
- otherwise
- disp('Currently only sampling rates 500Hz, 1kHz, 2kHz, 10 kHz and 30kHz are supported.');
- return;
- end
- %% Finding the unit of the data.
- switch lower(signalUnit)
- case 'v'
- inputData = inputData * 1000000;
- case 'mv'
- inputData = inputData * 1000;
- case 'uv'
-
- case 'nv'
- inputData = inputData / 1000;
- otherwise
- disp('Invalid unit.');
- return;
- end
- %% Converting samplingFreq to type double
- samplingFreq = double(samplingFreq);
- % Warren from More lab @ Stanford
- %% Determining channel count and data length
- channelCount = min(size(inputData));
- dataLength = max(size(inputData));
- %% Creating a label of 16 character long.
- newChanLabel = [num2str(samplingFreq/1000) ' kS/s'];
- newChanLabel = [newChanLabel repmat(' ', [1, 16-length(newChanLabel)])];
- %% Converting inputData to int16
- inputData = int16(inputData);
- %% Rewriting the metatags
- NSx = openNSx(which('bnsx.dat'));
- NSx.MetaTags.SamplingLabel = newChanLabel(1:16);
- NSx.MetaTags.ChannelCount = channelCount;
- NSx.MetaTags.SamplingFreq = samplingFreq;
- NSx.MetaTags.TimeRes = samplingFreq;
- NSx.MetaTags.ChannelID = 1:NSx.MetaTags.ChannelCount;
- NSx.MetaTags.DateTime = datestr(now);
- d = datevec(date);
- NSx.MetaTags.DateTimeRaw = [d(1:2), weekday(date), d(3:end), 0];
- NSx.MetaTags.Comment = ['This data was converted into a NSx by matrixToNSx' repmat(' ',1, 207)];
- NSx.MetaTags.FileSpec = '2.3';
- NSx.MetaTags.Timestamp = 0;
- NSx.MetaTags.DataPoints = dataLength;
- NSx.MetaTags.DataDurationSec = NSx.MetaTags.DataPoints / NSx.MetaTags.SamplingFreq;
- NSx.Data = inputData;
- saveNSx(NSx, [savedFilePath savedFileExt]);
|