Matlab FFT. Застрял понимание отношения между частотой и результатом - PullRequest
6 голосов
/ 05 октября 2008

Мы пытаемся проанализировать обтекание круглого цилиндра, и у нас есть набор значений Cp, которые мы получили из эксперимента в аэродинамической трубе. Первоначально мы начали с частоты выборки 20 Гц и попытались найти частоту выделения вихрей, используя FFT в matlab. Мы получили частоту около 7 Гц. Затем мы провели тот же эксперимент, но единственное, что мы изменили, - это частота дискретизации - от 20 до 200 Гц. Мы получили частоту выделения вихрей около 70 Гц (это место, где пик расположен на графике). График не изменяется независимо от вводимых нами данных Cp. Единственный раз, когда пик отличается, это когда мы меняем частоту дискретизации. Похоже, что увеличение частоты выделения вихрей пропорционально частоте выборки, и это, похоже, не имеет смысла вообще. Любая помощь в установлении взаимосвязи между частотой выборки и частотой выброса вихрей будет очень полезна.

Ответы [ 7 ]

11 голосов
/ 05 октября 2008

Проблема, которую вы видите, связана с «псевдонимом данных» из-за ограничений возможности БПФ обнаруживать частоты выше Частота Найквиста (половина частоты дискретизации) .

При использовании псевдонимов данных, пик реальной частоты будет центрироваться вокруг (реальная частота по модулю частота Найквиста). В вашей выборке 20 Гц (при условии, что 70 Гц является истинной частотой, это приводит к нулевой частоте, что означает, что вы не видите реальную информацию. Одна вещь, которая может помочь вам в этом, - это использовать FFT «управление окнами».

Другая проблема, с которой вы можете столкнуться, связана с генерацией зашумленных данных с помощью измерения с одним БПФ. Лучше взять много данных, использовать окна с перекрытием, и убедиться, что у вас есть как минимум 5 БПФ, которые вы усредняете, чтобы найти свой результат. Как упоминал Стивен Лоу, вы должны также делать выборки более быстрыми темпами, если это возможно. Я бы порекомендовал сэмплировать с максимальной скоростью, которую могут сэмплировать ваши инструменты.

Наконец, я бы порекомендовал вам прочитать некоторые выдержки из Числовые рецепты на C (<- link): </p>

Вам не нужно читать исходный код на C - только объяснения. Числовые Рецепты для C имеет превосходную сжатую информацию по теме.

Если у вас есть еще вопросы, оставьте их в комментариях. Я постараюсь ответить на них как можно лучше.

Удачи!

4 голосов
/ 05 октября 2008

это, вероятно, не проблема программирования, это звучит как проблема измерения эксперимента

я думаю, что частота дискретизации должна быть как минимум вдвое больше частоты колебаний, в противном случае вы получите артефакты; это может объяснить разницу. Обратите внимание, что отношение частоты FFT к частоте дискретизации составляет 0,35 в обоих случаях. Можете ли вы повторить эксперимент с более высокой частотой дискретизации? Я думаю, что если это узкий цилиндр при сильном ветре, он может вибрировать / колебаться быстрее, чем может обнаружить частота дискретизации.

Надеюсь, это поможет - есть вероятность 97,6%, что я не знаю, о чем говорю; -)

2 голосов
/ 02 апреля 2009

Метинкс, вам нужно серьезно заняться цифровой обработкой сигналов, прежде чем вы сможете начать понимать все нюансы DFT (FFT). Если бы я был тобой, я бы основал это сначала с этой великой книгой:

Обработка дискретного сигнала

Если вы хотите больше математической обработки, которая действительно расширит ваши способности,

Анализ Фурье по Кёрнеру

2 голосов
/ 05 октября 2008

Если это не проблема алиасинга, похоже, вы могли бы построить частотную характеристику на нормализованной частотной шкале, которая будет меняться с частотой дискретизации. Вот пример довольно хорошего способа построить частотную характеристику сигнала в Matlab:

Fs = 100;
Tmax = 10;
time = 0:1/Fs:Tmax; 
omega = 2*pi*10; % 10 Hz
signal = 10*sin(omega*time) + rand(1,Tmax*Fs+1);

Nfft = 2^8;
[Pxx,freq] = pwelch(signal,Nfft,[],[],Fs)
plot(freq,Pxx)

Обратите внимание, что частота дискретизации должна быть явно передана команде pwelch, чтобы вывести «реальные» данные частоты. В противном случае при изменении частоты дискретизации ячейка, в которой возникает резонанс, будет смещаться, что аналогично проблеме, которую вы описываете.

0 голосов
/ 07 октября 2008

Мой коллега написал несколько замечательных лицензированных по GPL функций для спектрального анализа: http://www.mecheng.adelaide.edu.au/~pvl/octave/

( Обновление : этот код теперь является частью одного из модулей Octave:
http://octave.svn.sourceforge.net/viewvc/octave/trunk/octave-forge/main/signal/inst/.
Но может быть сложно извлечь из него только те кусочки, которые вам нужны.)

Они написаны как для Matlab, так и для Octave и служат, в основном, для замены аналогичных функций в панели инструментов обработки сигналов. (Таким образом, код выше должен работать нормально.)

Это может помочь с вашим анализом данных; лучше, чем кататься с fft и т. п.

0 голосов
/ 07 октября 2008

Я пытался использовать код частотной характеристики, как указано выше, но, похоже, у меня нет соответствующего набора инструментов в Matlab. Есть ли способ сделать то же самое без использования команды FFT? Пока что вот что у меня есть:

   % FFT Algorithm

Fs = 200;                     % Sampling frequency
T = 1/Fs;                     % Sample time
L = 65536;                    % Length of signal
t = (0:L-1)*T;                % Time vector
y = data1;                    % Your CP values go in this vector

NFFT = 2^nextpow2(L); % Next power of 2 from length of y
Y = fft(y,NFFT)/L;
f = Fs/2*linspace(0,1,NFFT/2);

% Plot single-sided amplitude spectrum.
loglog(f,2*abs(Y(1:NFFT/2))) 
title(' y(t)')
xlabel('Frequency (Hz)')
ylabel('|Y(f)|')

Я думаю, что-то не так с кодом, который я использую. Я не уверен, что, хотя.

0 голосов
/ 05 октября 2008

Взгляните на этот связанный вопрос. В то время как первоначально спрашивали о спросе о VB, ответы в основном касаются БПФ

...