Есть ли способ определить длину сигнала при вычислении спектрограммы для определенного размера

#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 я должен принять?