gpt4 book ai didi

matlab - Matlab-以正确的比例创建psd

转载 作者:行者123 更新时间:2023-12-02 23:47:36 25 4
gpt4 key购买 nike

我想分析一个音频数据(.wav,pcm,32k作为采样率),并用轴Sxx(瓦特/赫兹而不是db)和f(赫兹)创建它的psd。

因此,我将从读取音频数据开始:

[x,fs]=audioread('test.wav');

在此之后,我遇到了一些问题,因为我真的不知道如何进行操作,而且Matlab总是告诉我,将来将不支持psd函数,我应该使用pwelch ..(也尝试过构建autocorr,然后再构建使用傅立叶到达Sxx,但效果不佳)

因此,有人可以告诉我如何从 vector x转换为具有psdvalues瓦特/赫兹的 vector ,然后将其绘制吗?

非常感谢您的各种帮助! :)

Update1 :是的,我确实阅读过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)

我能够在db中获得具有正确频率峰值的图。 (虽然我不知道dspdata.psd如何工作)

我尝试了:
[Pyy,f]=pwelch(x,fs)
plot(Pyy)

这给了我非db刻度,但峰值的频率不正确

更新2 :
首先,非常感谢您的详细回答!目前,我正在练习我的matlabskills以及我的英语,但是所有特定的技术术语使我很难。
当使用在频率为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 :
http://s000.tinyupload.com/index.php?file_id=33803229773204653857
该wav文件的主频应为1khz,持续时间为3秒,采样频率为44100Hz。 (如果我绘制从音频读取器接收的数据,则振荡似乎是合理的)


[y,fs]=audioread('1khz.wav');
[pyy,f]=pwelch(y,fs);
plot(f,pyy)

我在x轴上的峰值为0.14。

如果我用
[y,fs]=audioread('1khz.wav');
[pyy,f]=pwelch(y,[],[],[],fs);
plot(f,pyy)

相反,峰值在1000。这样对吗?我如何解释y轴上的差异比例? (pwels与abs的平方)
我还想问一下是否可以在Matlab中获得平坦的awgn psd? (由于您只有有限的元素,因此我不知道该到达那里)

再次感谢您的详细支持!

更新4
@ A.Donda
因此,我有一个新问题,我认为可能有必要进一步详细介绍。所以我的计划基本上是做以下事情:
  • 读取和音频数据([y,fs])并生成具有一定SNR([n,fs])的白噪声
  • 生成一个过滤器H,其形状类似于PSD(n)的PSD(y)。
  • 生成一个逆滤波器G = H ^(-1),它会还原H的效果。

  • 我的问题是使用pwelch时,pyy的所得 vector 长度比y的 vector 长度小得多。由于我的过滤器是由P = sqrt(pnn / pyy)确定的,因此我无法乘以fft(y)* H,因此没有任何结果。
    您知道这个问题有什么帮助吗?
    还是有办法从PSD(​​韦尔奇估计)返回到正常信号(如pwelch的反函数)?

    最佳答案

    psd文档中的示例中,您自己计算psd估计值,然后将其放入dspdata.psd容器中并进行绘制。 dspdata.psd数据在这里为您执行的工作基本上是计算频率轴并将其提供给plot命令,仅此而已。您会得到一张频谱密度估计值的图,但这就是您使用fft进行计算的结果,它是您可以获得的最简单和最差的psd估计值,即所谓的周期图。

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

    [Pyy,f]=pwelch(x,fs)
    plot(f,Pyy)

    应该以正确的频率给您峰值。

    您对 pwelch的使用几乎是正确的,但是必须将采样频率作为第5个参数,然后在绘图中使用频率轴信息。
    [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转换器获得的?如果是的话,您应该能够将数据与物理尺寸和单位相关联,但这是不平凡的一步。

    就个人而言,我真的建议您精通英语,因为使用软件(尤其是编程界面)时,如果没有正确理解文档,这是灾难的根源。

    关于matlab - Matlab-以正确的比例创建psd,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29456419/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com