Matlab FFT - масштабирующая ось Y - PullRequest
0 голосов
/ 27 мая 2018

В качестве базы данных я измерил данные, в которых были записаны вольт.Matlab теперь будет использоваться для выполнения БПФ.У меня есть следующие вопросы: - Какая единица у меня на оси ординат после БПФ?Тоже вольт?- Как правильно масштабируется?Скрывая отрицательные частоты (Найквиста), мне бы фактически пришлось удвоить амплитуду, верно?- Должен ли я снова умножить все значения FFT на 20 * log10 (FFT), чтобы представить ординату в дБ?

Большое вам спасибо за вашу поддержку!Франк

Пример Matlab:

load('TimeDomain.mat')%loading of the time domain signal
L=2500; %length of the signal
Fs=500000;%sampling frequency
N=2^nextpow2(L);%scale factor
t=(0:L-1)*10^-3;%time domain array
f=linspace(0,Fs/2,length(t));%frequency domain array 

FFT=abs(fft(Timedomain,N));   
figure(1)
plot(f,FFT(1:2500))

1 Ответ

0 голосов
/ 07 декабря 2018

Да, после БПФ, единица оси ординат по-прежнему будет вольт.Вы можете масштабировать его путем деления на количество выборок вашего сигнала, тогда вы действительно можете умножить на два (кроме первого и последнего элементов, которые представляют соответственно частоту 0 и Fs/2), если вы хотите построить весь спектрв положительную сторону.

Тогда, если вы хотите построить в дБ, вы можете использовать функцию mag2db, которая применяет формулу, которую вы сказали.

Я нашелнекоторые странности в вашем коде, поэтому я предлагаю некоторые исправления.Мой сигнал Timedomain представляет собой синус 100 кГц при 1 В.

Fs = 500000;                    % sampling frequency
L = 2500;                       % length of the signal
t = (0:L-1)/Fs;                 % time domain array
f = linspace(0, Fs/2, L/2+1);   % frequency domain array

Timedomain = cos(2*pi*100000*t); % Input signal

FFT = abs(fft(Timedomain)/L);
FFT(2:L/2) = 2*FFT(2:L/2);

%% Plots
subplot(2,1,1);
plot(f, FFT(1:L/2+1)); xlabel('Frequency (Hz)'); ylabel('Tension (V)');
subplot(2,1,2);
plot(f, mag2db(FFT(1:L/2+1))); xlabel('Frequency (Hz)'); ylabel('Tension (dBV)');

Это возвращает:

scaling_y

...