Чтобы все пики были четко видны в Matlab

Я наконец решил свою проблему здесь с lennon310. У меня есть картина тысяч тонких пиков в картине частотно-временных характеристик. Я не могу видеть все время на одной картине. В зависимости от физической ширины моего временного окна, некоторые окна появляются, а некоторые становятся видимыми.

Картинки моих данных, которые я строю imagesc

введите описание изображения здесь

введите описание изображения здесь

введите описание изображения здесь

Все фотографии с одинаковых точек данных T, F, B.

Как вы можете нарисовать все пики сразу на картинке в Matlab?

7 ответов

Решение

Вам необходимо изменить размер изображения, используя повторную выборку, чтобы предотвратить эффект псевдонима (этот крейгим описан как неизбежный).

Например, MATLAB imresize Функция может выполнять сглаживание. Не используйте "ближайший" метод изменения размера, это то, что у вас есть сейчас.

Расширение до ответа @BenVoigt

Моя попытка

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

где некоторые проблемы

Я снова получаю картинку, где недостаточно разрешения

введите описание изображения здесь

3-е расширение ответа BenVoigt

Я сейчас строю картину

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

У меня большая проблема с алиасами в моих фотографиях. Вероятно, что-то вроде этого должно быть, чтобы манипулировать частотно-временным представлением

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

2-е расширение ответа Бенуа

Мое предложение для одного фильтра ядра - со сверткой относительной случайной ошибки

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

Это то, что BenVoigt подразумевает под фильтром ядра для распространения?

Это дает результаты, как

где разрешение все еще проблема. Центральные пики имеют тенденцию легко размножаться, если я изменяю размер окна.

У меня был активный код на картинке выше, но результат не изменился. Приведенного выше кода все еще недостаточно для фильтра ядра дисплея. Возможно, некоторые функции фильтра должны быть применены к оси времени и частоты отдельно, что-то вроде:

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

Эти фильтры портят значения на обеих осях. Мне нужно понять их лучше, чтобы это исправить. Но сначала нужно понять, верны ли они.

Размер был изменен до сих пор. Размер данных был вдвое больше, чем у 5001x1, а у F и T 13635x1 - вдвое. Поэтому я думаю, что я должен изменить размер, наконец, после установки оси, меток и заголовка

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

поскольку распределение является билинейным.

4-е расширение ответа и комментария BenVoigt

Я удаляю фильтры и добавляю случайные относительные ошибки. Я устанавливаю размер T,F,B и запускаю

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

Я получаю еще со значительным алиасингом, но с другой

3-е расширение ответа BenVoigt

Моя попытка рассказать imagesc насколько велико сделать изображение, вместо того, чтобы использовать размер монитора, чтобы он не удалял данные.

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

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

Я не уверен, где я должен указать количество пикселей по оси X и Y, либо в команде imagesc или же imresize,

Как правильно изменить размер изображения здесь?

Это не легкомысленно, но я думаю, что единственный способ - получить более широкий монитор с более высокой плотностью пикселей. MATLAB и ваша видеокарта могут отображать только столько пикселей на экране и должны решить, что показывать, а какие пропускать. Данные все еще там, они просто не отображаются. Поскольку у вас много очень узких линий, некоторые из них будут пропущены при принятии решения о том, какие пиксели загораться. Изменение размера временного окна изменяет, какие строки удаляются, а какие становятся достаточно удачливыми, чтобы отображаться на экране.

Мои предложения приведены в произвольном порядке: сверните линии с гауссианой вдоль оси времени, чтобы расширить их, увеличивая тем самым вероятность того, что часть пика появится на экране. Распечатайте их на принтере с разрешением 600 точек на дюйм и посмотрите, появятся ли они. Сделайте несколько графиков, каждый из которых увеличен в отдельном временном окне.

Другие вопросы по тегам