我想在一组信号上使用pwelch,我有一些问题。
首先,让我们说我们有32个持续30秒的(EEG)信号。采样频率为fs=256
个采样/秒,因此每个信号的长度为7680.我想使用pwelch
来估计这些信号的功率谱密度(PSD)。
问题1:
基于pwelch
' s documentation,
pxx = pwelch(x)返回使用Welch的重叠段平均估计器找到的输入信号x的功率谱密度(PSD)估计值pxx。当x是向量时,它被视为单个通道。当x是矩阵时,PSD是针对每列独立计算的,并存储在pxx的相应列中。
但是,如果按照以下方式致电pwelch
% ch_signals: 7680x32; one channel signal per each column
[pxx,f] = pwelch(ch_signals);
结果pxx
的大小为1025x1
,而不是我期望的1025x32
,因为文档说明如果x是矩阵,则PSD会针对每列独立计算并存储在pxx的相应列中。
问题2:
让我们说我克服了这个问题,并且我独立地计算每个信号的PSD(通过将pwelch
应用于ch_signals
的每一列),我想知道什么是最好的方法这样做。假设信号是采样频率为fs=256
的30秒信号,我应该如何调用pwelch
(使用什么参数?)以使PSD有意义?
问题3:如果我需要将我的32个信号中的每一个分成窗口并将pwech应用到每个窗口,那么最好的方法是什么?让我们说我想将每个30秒的信号分成3秒的窗口,重叠2秒。我该如何为每个窗口调用pwelch
?
答案 0 :(得分:1)
这是一个例子,就像你的情况一样,
结果表明该算法表明信号频率恰到好处。
矩阵的每一列y
都是正弦曲线,用于检查其工作原理。
窗口是3秒,重叠2秒,
Fs = 256;
T = 1/Fs;
t = (0:30*Fs-1)*T;
y = sin(2 * pi * repmat(linspace(1,100,32)',1,length(t)).*repmat(t,32,1))';
for i = 1 : 32
[pxx(:,i), freq] = pwelch(y(:,i),3*Fs,2*Fs,[],Fs); %#ok
end
plot(freq,pxx);
xlabel('Frequency (Hz)');
ylabel('Spectral Density (Hz^{-1})');