将pwelch用于一组信号:一些问题(Matlab)

时间:2016-02-20 20:03:47

标签: matlab spectral-density

我想在一组信号上使用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

1 个答案:

答案 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})');

enter image description here