#matlab #image-processing #signal-processing #fft #spectrogram
#matlab #обработка изображений #обработка сигналов #БПФ #спектрограмма
Вопрос:
Есть ли способ определить длину сигнала и размер окна, которые следует использовать для создания спектрограммы заданного пользователем размера x*y
? Например, для создания спектрограммы определенного размера 100*100
длина сигнала равна N=80050
и w = 80
. Я создал спектрограмму сигнала с использованием matlab следующим образом:
N = 80050;
w = 80;
signal = randn(1,N);
spec=spectrogram(signal,w,0,256);
specto= spec(1:100,1:100);
specto_power=(20*log10(abs(specto)));
specMin_1 = min(specto_power(:));
specMax_1 = max(specto_power(:));
figure(1)
pcolor(specto_power)
caxis([specMin_1 specMax_1])
shading flat
pcolor(specto_power)
caxis([specMin_1 specMax_1])
shading flat
Как мне определить N
и размер окна w
для генерации разных спектрограмм разных размеров, скажем 40*40
, 50*50
и т.д.?
Ответ №1:
Помимо длин сигнала и окна, вам доступен другой регулятор настройки — это шаг (или «прыжок») между последовательными сегментами в анализе спектрограммы, который также играет роль в том, сколько кадров выходных данных вычисляется. В функции спектрограммы Matlab шаг определяется noverlap
аргументом, связанным noverlap = w - step
. Для длины сигнала N
, длины окна w
и шага step
количество кадров (столбцов) в спектрограмме равно
# frames = floor((N - w) / step) 1
(Например, есть один кадр, если N == w; два кадра, если N == w шаг; и т.д.)
В другом измерении количество частот в спектрограмме относится к аргументу размера БПФ, nfft
. Спектр реального сигнала имеет комплексно сопряженную (эрмитову) симметрию, поэтому около половины ячеек являются избыточными. Избыточные ячейки обычно исключаются из спектрограммы. Предполагая, что это сделано, количество частот (строк) в спектрограмме равно
# frequencies = floor(nfft / 2) 1
Чтобы генерировать спектрограммы определенных размеров, мы можем использовать приведенные выше формулы в обратном порядке как
N = w ((# frames) - 1) * step,
nfft = 2 * ((# frequencies) - 1).
Комментарии:
1. Спасибо за ответ, но я не могу понять, как применить эту формулу к моей проблеме. В моем случае я знаю размеры спектрограммы. Итак, в формуле для N и w, где мне ввести значение размера? Не могли бы вы подробнее рассказать? Если
nooverlap
значение true,, то в моем вопросе строка, содержащая функцию spectrogram(), будет иметьstep=0
в моемspectrogram()
вводе. ТогдаN
значение не соответствует для100*100
выходной спектрограммы размера. Я в замешательстве.2. В моем примере,
nooverlap =0
, так каково значениеstep
? Не могли бы вы показать на примере с любым произвольным размером спектрограммы, какN
определяется.3.Если я применю формулу, то для создания спектрограммы размера,
size = 40*40
используяN = 200;
size = 40;
step = 1;
w= N-(size-1)*step = 78;
nfft= 2 * (size - 1);
( # frequencies = rows = size = 40)specto=spectrogram(signal,w,0,nfft);
, не будет выдан результат размером 40 на 40.4.
w = N-(size-1)*step
В вашем примере должно быть 161, а не 78. Кроме того, третьим аргументомspectrogram
должно бытьnoverlap
тоw - step = 160
, которое равно, а не 0. Попробуйте N = 200, w = 161, noverlap = 160, nfft = 78.5. Спасибо, это работает. Последнее уточнение: если третий аргумент
spectrogram
равен 0, как я написал в своем вопросе, то это не означает, что overalap = 0? По умолчаниюnooverlap=50%
, поэтому, если я передаю значение 0, то какое значениеnooverlap
я должен принять?