БПФ заданной диаграммы (данных) - PullRequest
0 голосов
/ 17 мая 2018

Я собрал некоторые данные о распределении давления акустического поля вдоль оси, то есть Pressure_vs_distance, на определенной частоте источника (скажем, 0,5 МГц).Теперь я хочу получить частотные составляющие этих данных (которые будут n * 0,5 МГц), но каждый код, который я пробую, не может извлечь эти частоты, и диаграмма FFT походит на вертикальную линию в нуле.Данные и рисунок приведены ниже.Не могли бы вы помочь мне понять, что не так?

PS: Я сам догадываюсь о количестве осевых данных.Но даже когда я его увеличил, результат не изменился (форма диаграммы FFT).

Давление (МПа) _vs_axial distance (cm)

data(Размер ~ 2 Мб): https://ufile.io/wjhlo

L=length(y);
dx=9.43479300064157e-05;
fs=1/dx;
out=fft(y,L)/L;
figure
plot(fs/2*linspace(0,1,(length(out)/2)+1),abs(out(1:(length(out)/2)+1))) 
title('One sided Spectrum')
xlabel('Normalized frequency')
ylabel('Magnitude')

Ответы [ 2 ]

0 голосов
/ 17 мая 2018

Прежде всего подготовьте свои данные: попробуйте передать данные через фильтр предварительного выделения:

y1 = filter([1 -1], 1, y);

Далее, просмотрите свои данные и удалите очевидные ошибки данных:

y1(1:3) = 0;

Анализ Фурье подходит только для квазипериодических сигналов.Таким образом, вы должны выбрать интервал квазистационарности и выполнить анализ на таких (возможно перекрывающихся) интервалах.Допустим, сигнал квазистационарен на 5000 баллов.И мы хотим выполнить анализ со сдвигом 100 пунктов:

sampleRate = 1/(x(2)-x(1));
frameSize = 5000;
frameShift = 100;
[signalSpectrogram, freqObs, timeObs] = spectrogram(y1, frameSize, frameSize-frameShift, pow2(nextpow2(frameSize)), sampleRate);

Давайте отобразим все результаты:

figure('NumberTitle','off', 'Name','The Spectral Analysis', 'Units','normalized', 'Position',[0 0 1 1]);

subplot(3,1,1);
plot(x,y);
grid('on');
xLim = xlim();
title('Original Signal');

subplot(3,1,2);
plot(x,y1);
grid('on');
title('Prepared Signal');

subplot(3,1,3);
imagesc(timeObs, freqObs, 10*log10(signalSpectrogram.*conj(signalSpectrogram)));
axis('xy');
axis([xLim 0 200]);
title('Prepared Signal Spectrogram');

В конце вы должны получить что-то похожее на: spectrogram

0 голосов
/ 17 мая 2018

Из этого вопроса:

Путаница в выяснении связи между фактическими значениями частоты и индексами графика БПФ в MATLAB

[Ycomp, fHz] = getFFT(y(1:1000),1/(x(2)-x(1)))

enter image description here

Ваша частота дискретизации составляет 10,6 кГц. Таким образом, согласно теореме отсчетов Найквиста Шеннона, вы не будете обнаруживать частоты выше 5,3 кГц. Не уверен, откуда ваши 0,5 МГц.

...