Matlab-用右比例创建psd

Matlab-用右比例创建psd,matlab,audio,Matlab,Audio,我想用pcm分析audiodata.wav,32k作为采样率,并创建它的psd,轴为Sxx瓦/赫兹,而不是db和f赫兹 因此,我首先通过以下方式读取音频数据: [x,fs]=audioread('test.wav'); 在这之后,我遇到了一些问题,因为我真的不知道如何继续,而且Matlab总是告诉我psd函数在将来将不受支持,我应该使用pwelch。。还试图建立自相关,然后使用傅立叶获得的Sxx,但它没有工作得很好 有谁能告诉我,如何从向量x得到psd值为瓦特/赫兹的向量,然后画出来 非常感谢

我想用pcm分析audiodata.wav,32k作为采样率,并创建它的psd,轴为Sxx瓦/赫兹,而不是db和f赫兹

因此,我首先通过以下方式读取音频数据:

[x,fs]=audioread('test.wav');
在这之后,我遇到了一些问题,因为我真的不知道如何继续,而且Matlab总是告诉我psd函数在将来将不受支持,我应该使用pwelch。。还试图建立自相关,然后使用傅立叶获得的Sxx,但它没有工作得很好

有谁能告诉我,如何从向量x得到psd值为瓦特/赫兹的向量,然后画出来

非常感谢您的帮助

更新1:是的,我确实读过pwelch的文档,但恐怕我的英语太差了,无法完全理解。 因此,如果我使用psd文档:

nfft = 2^nextpow2(length(x));
Pxx = abs(fft(x,nfft)).^2/length(x)/fs;
Hpsd = dspdata.psd(Pxx(1:length(Pxx)/2),'fs',fs);  
plot(Hpsd) 
我能得到以分贝为单位的曲线图,峰值在正确的频率。但是我不知道dspdata.psd是如何工作的

我试过:

[Pyy,f]=pwelch(x,fs)
plot(Pyy)
这给了我一个非分贝标度,但峰值在错误的频率

更新2: 首先,非常感谢您的详细回答!目前,我正在学习我的数学技能和英语,但所有具体的专业术语都让我很难掌握。。 当在清晰频率为1khz的wav数据上使用pwelch示例时,该图显示峰值约为0.14,它可能仍然是一个特殊的缩放x轴吗

如果我这样做:

[y,fs]=audioread('test.wav');
N=length(y);
bin_vals=0:N-1;
fax_Hz= bin_vals*fs/N;
N_2=ceil(N/2);
Y=fft(y);
pyy=Y.*conj(Y);
plot(fax_Hz(1:N_2),pyy(1:N_2))
结果似乎是正确的,但我仍然需要一些时间来寻找以W/Hz显示y轴的正确方法,因为我不知道音频信号是如何产生的

更新3: 该wav文件的主频应为1khz,持续时间为3秒,采样频率为44100Hz。如果我绘制从audioread接收到的数据,振荡似乎是合理的

我在x轴上得到一个0.14的峰值

如果我使用

[y,fs]=audioread('1khz.wav');
[pyy,f]=pwelch(y,[],[],[],fs);
plot(f,pyy)
相反,峰值在1000。这条路对吗?我如何解释y轴上的差异缩放?pwelch与abs的平方比 我还想问,是否有可能在matlab中获得awgn的平坦psd?因为你只有有限元,我不知道怎么去

再次感谢您的详细支持

更新4 @A.顿达 所以我有一个新问题,我认为可能有必要更详细地讨论一下。因此,我的计划基本上是做以下工作:

读取音频数据[y,fs],并在一定的信噪比[n,fs]下产生白噪声 生成一个滤波器H,该滤波器将PSDy的形状与PSDn相似 生成一个反向过滤器G=H^-1,该过滤器可恢复H的效果。 我的问题是,使用pwelch,得到的pyy的向量长度比y的向量长度小得多。因为我的过滤器是由P=sqrtpnn/pyy确定的,所以我不能将ffty*H相乘,因此不会得到任何结果。 你知道这个问题有什么帮助吗?
或者有没有一种方法可以从PSD Welch估计值返回到正常信号,如pwelch的反函数?

在PSD文档中的示例中,您自己计算PSD估计值,然后将其放入dspdata.PSD容器中并绘制。这里dspdata.psd数据为您所做的基本上是计算频率轴并将其提供给plot命令,仅此而已。你可以得到一个谱密度估计图,但这是你自己用fft计算的,这是你能得到的最简单和最差的psd估计,一个所谓的周期图

您对pwelch的使用几乎是正确的,您只是忘记在绘图中使用频率轴信息

[Pyy,f]=pwelch(x,fs)
plot(f,Pyy)
[Pyy,f]=pwelch(y,[],[],[],fs);
plot(f,Pyy)
应该以正确的频率给出峰值。

pwelch的使用几乎是正确的,但必须将采样频率作为第五个参数,然后在绘图中使用频率轴信息

[Pyy,f]=pwelch(x,fs)
plot(f,Pyy)
[Pyy,f]=pwelch(y,[],[],[],fs);
plot(f,Pyy)
应该以正确的频率给出峰值

pwelch给出的是信号在Hz上的频谱密度。因此,需要正确的轴标签

xlabel('frequency (Hz)')
ylabel('psd (1/Hz)')
你给pwelch的信号是一个没有物理维度的纯数字序列。通过指定采样率,时间轴获得物理单位s,因此产生的频率以Hz为单位,密度以1/Hz为单位。但是你的时间序列值仍然没有物理维度,因此密度不能与W相关。你的音频信号是通过校准的a/D转换器获得的吗?如果是,您应该能够将数据与物理维度和单位关联起来,但这是非常重要的一步


就我个人而言,我真的建议你温习一下英语,因为在没有正确理解文档的情况下使用软件,尤其是编程接口,是一种灾难。

使用pwelch是一个很好的建议。你读了吗?在我的更新中回答了很多!我写了一个更新2,并将非常感谢进一步的更新information@klaus,我想不出一个理由
o仅使用傅里叶变换平方估计psd,而不是像pwelch这样的合适的谱估计器。如果峰值未达到预期值,则可能是您或wav文件指定了错误的采样率。如果有明显的主频,绘制信号本身,放大,看一个周期有多长;这是否符合您对采样率和主频的假设?如果你可以发布音频文件本身,我可以看一看。关于物理单位,我真的认为这是不可能的,除非你知道录音/采样/数字化设备的特性。@klaus啊…,我只是从你的问题中采用了pwelch的调用语法,没有检查它。自我提醒:千万不要发布你没有检查过的代码有了上一次更新,一切都会好起来的。我也会编辑我的答案。谢谢:我认为在你的支持下,难免会犯一些错误。你可能也知道我其他问题的答案吗?不同的尺度解释以及如何在高斯白噪声具有有限值时获得平坦的psd