Question

I finally solved my problem here with lennon310. I have a picture of thousands of thin peaks in Time-Frequency picture. I cannot see all the same time in one picture. Depending on the physical width of my time window, some windows appear and some come visible.

Pictures of my data which I plot by imagesc

enter image description here

enter image description here

enter image description here

All pictures are from the same data points T, F, B.

How can you plot all peaks at once in a picture in Matlab?

Was it helpful?

Solution

You need to resize the image using resampling to prevent the aliasing effect (that craigim described as unavoidable).

For example, the MATLAB imresize function can perform anti-aliasing. Don't use the "nearest" resize method, that's what you have now.

OTHER TIPS

Extension to @BenVoigt's answer

My try

B = abs(B);
F1 = filter2(B,T); % you need a different filter kernel because resolution is lower    
T = filter2(B,F);
F = F1;
image1 = imagesc(B);
display1 = imresize(image1, [600 600], 'bilinear');   
imshow(T*t, F*fs, display1); 

where are some problems.

I get again picture where the resolution is not enough

enter image description here

2nd Extension to BenVoigt's answer

My suggestion for one kernel filter is with convolution of relative random error

data(find(data ~= 0)) = sin(pi .* data(find(data ~= 0))) ./ (pi*data(find(data ~= 0)));        
data(find(data == 0)) = 1; % removing lastly the discontinuity
data1 = data + 0.0000001 * mean(abs(data(:))) * randn(size(data));
data = conv(data, data1);

Is this what BenVoigt means by the kernel filter for distribution?

This gives results like

enter image description here

where the resolution is still a problem. The central peaks tend to multiply easily if I resize the window.

I had old code active in the above picture but it did not change the result. The above code is still not enough for the kernel filter of the display. Probably, some filter functions has to be applied to the time and frequency axis separately still, something like:

F1 = filter2(B,T); % you need a different kernel filter because resolution is lower    
T = filter2(B,F);
F = F1;

These filters mess up the values on the both axis. I need to understand them better to fix this. But first to understand if they are the right way to go.

The figure has be resized still. The size of the data was 5001x1 double and those of F and T 13635x1 double. So I think I should resize lastly after setting axis, labels and title by

imresize(image, [13635 13635], 'bilinear');   

since the distirbution is bilinear.

3rd Extension to BenVoigt's answer

I plot the picture now by

imagesc([0 numel(T)], [0 numel(F)], B);              

I have a big aliasing problem in my pictures. Probably, something like this should be to manipulate the Time-Frequency Representation

T = filter2(B,t); % you need a different filter kernel because resolution is lower    
F = filter2(B,fs);

4th extension to BenVoigt's answer and comment

I remove the filters and addition of random relative errors. I set the size of T,F,B, and run

imagesc([0 numel(T)], [0 numel(F)], B, [0 numel(B)])

I get still with significant aliasing but different picture

enter image description here

This isn't being flippant, but I think the only way is to get a wider monitor with a higher pixel density. MATLAB and your video card can only show so many pixels on the screen, and must decide which to show and which to leave out. The data is still there, it just isn't getting displayed. Since you have a lot of very narrow lines, some of them are going to get skipped when decisions are made as to which pixels to light up. Changing the time window size changes which lines get aliased away and which ones get lucky enough to show up on the screen.

My suggestions are, in no particular order: convolute your lines with a Gaussian along the time axis to broaden them, thus increasing the likelihood that part of the peak will appear on the screen. Print them out on a 600 dpi printer and see if they appear. Make several plots, each zooming in on a separate time window.

3rd Extension to BenVoigt's answer

My attempt to tell imagesc how big to make the image, instead of letting to use the monitor size, so it won't away data.

imagesc(T*t, F*fs, B, [50 50]);           
% imagesc(T*t, F*fs, B');

% This must be last
imresize(image, 'bilinear', [64 30],);   

I am not sure where I should specify the amount of pixels in x-axis and y-axis, either in the command imagesc or imresize.

What is the correct way of resizing the image here?

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top