Parfor gives NaN when for does not
Show older comments
I'm having issues parallelizing some code I use for a "homemade" spectrum analyzer.
It works fine in a for loop, however the
data=smooth(data,window);
Data=data(1+floor(window/2):length(data)-ceil(window/2));
part below (BoydFilter) causes issues (if I change it to Data=data; I get actual numbers) and my Data in ReadDAQTraces becomes a matrix of NaNs.
Can anyone tell me what I'm doing wrong?
*I and Q are arrays of 34.4 million doubles, if size is a problem.
function ReadDAQTraces(Folder,NumberOfTraces,Time,Points)
global SampleRate
SampleRate=2e6;
Data=zeros(NumberOfTraces,Points);
parfor i=1:NumberOfTraces
Data(i,:)=ReadInDAQ(Folder,i,Time,Points)
i
end
a=1;%for a debug stop
end
function Data=ReadInDAQ(Folder,i,Time,Points)
if ~ischar(i)
filename = strcat(Folder,'\I_Trace',int2str(i),'.csv');
else
filename = strcat(Folder,'\',i,'I.csv');
end
delimiter = {''};
formatSpec = '%f%[^\n\r]';
fileID = fopen(filename,'r');
dataArray = textscan(fileID, formatSpec, 'Delimiter', delimiter, 'TextType', 'string', 'EmptyValue', NaN, 'ReturnOnError', false);
fclose(fileID);
I = dataArray{:, 1};
if ~ischar(i)
filename = strcat(Folder,'\Q_Trace',int2str(i),'.csv');
else
filename = strcat(Folder,'\',i,'Q.csv');
end
delimiter = {''};
formatSpec = '%f%[^\n\r]';
fileID = fopen(filename,'r');
dataArray = textscan(fileID, formatSpec, 'Delimiter', delimiter, 'TextType', 'string', 'EmptyValue', NaN, 'ReturnOnError', false);
fclose(fileID);
Q = dataArray{:, 1};
Data=ApplyFilter(I,Q,Time,Points);
end
function Data=ApplyFilter(I,Q,Time,Points)
global SampleRate
SamplingRate=SampleRate;
window=Time*SamplingRate;
I=BoydFilter(I,window).^2+BoydFilter(Q,window).^2;
clear Q
Data=AverageDetector(I,Points);
end
function Data=BoydFilter(data,window)
if(window~=floor(window))
window
window=floor(window);
end
if(mod(window,2)==0)
-1*window
error('Boyd Filter Window is not an Odd Number')
end
data=smooth(data,window);
Data=data(1+floor(window/2):length(data)-ceil(window/2));
end
function Output=AverageDetector(Input,TotalPoints)
Output=zeros(1,TotalPoints);
AverageOver=floor(length(Input)/TotalPoints);
for i=1:TotalPoints
Output(i)=mean(Input((i-1)*AverageOver+1:i*AverageOver));
end
end
Accepted Answer
More Answers (0)
Categories
Find more on Graphics Performance in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!