To make all peaks clearly visible in Matlab

匆匆过客 提交于 2019-12-01 12:49:50

问题


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

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

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


回答1:


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.




回答2:


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




回答3:


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

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.




回答4:


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);



回答5:


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




回答6:


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.




回答7:


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?



来源:https://stackoverflow.com/questions/20860895/to-make-all-peaks-clearly-visible-in-matlab

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!