python 问题。。。 对一个波形文件做fft,然后怎么获取那些频率分量? numpy有这个函数

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python 问题。。。 对一个波形文件做fft,然后怎么获取那些频率分量? numpy有这个函数相关的知识,希望对你有一定的参考价值。

python 问题。。。
对一个波形文件做fft,然后怎么获取那些频率分量?
numpy有这个函数么?

你提问的问题,有点错误。

波形是时域的,FFT变换就是为了将波形从时域转换到频域。

做了FFT 以后,得到的数据就是频率分量。


如果你说的是python fft代码如何写。下面就是:

这边演示的是语音波形。


wf = wave.open(wav_file,"rb")
params = wf.getparams()
nchannels, sampwidth, framerate, nframes = params[:4]
str_data = wf.readframes(nframes)
wf.close()

#将波形数据转化为数组
s = np.fromstring(str_data, dtype=np.short)
#wave_data。 这里波形是语音波形
s = np.fft.fft(s)  #fft  获得频谱

追问

获得频率了么?[ 2.12707686e+09 +0.j -5.18049880e+05 -63443.37936147j, -3.61576102e+05-162189.07946283j ..., , -3.61576102e+05+162189.07946283j -5.18049880e+05 +63443.37936147j]

追答

我不知道你的波形文件是怎么样的

追问

。。。得到的只是频谱而已,对于正弦波形,是想提取确定的频率分量

参考技术A 这个要知道波形文件的采样率fs以及你的采样点数目N。一般而言,对普通的音频文件等,频率间隔为fs/N,这是因为fs表示每秒钟采了多少点,除以总数N就恰好是频率间隔 参考技术B 这个是通信方面的 ,问题;具体得请教老师或同学

从波形文件中获取频率和幅度

【中文标题】从波形文件中获取频率和幅度【英文标题】:get frequency and amplitude from wave file 【发布时间】:2012-05-31 12:22:31 【问题描述】:

我想使用 c# 。 我尝试了 NAudio 和 FFT,但结果一无所获。你能帮帮我吗?

WaveChannel32 wave = new WaveChannel32(new WaveFileReader(open.FileName));
byte[] buffer = new byte[16384];
int read = 0;
double[] _fft;

while (wave.Position < wave.Length)

    read = wave.Read(buffer, 0, 16384); 
    _fft = FourierTransform.FFTDb(ref buffer);

如果哪里有问题,不要责骂。我是新手。

【问题讨论】:

也许这有助于codeproject.com/Articles/19590/WAVE-File-Processor-in-C 用这段没有任何结果的代码修改你的问题。 【参考方案1】:

语音最方便:使用双fft,即倒谱fft(logfft(sample))) 查找音高

但这不是我在这里提交的原因。谷歌似乎仍然在这里参考另一个问题:“如何获得 .WAV 文件的 采样频率”。

这很容易。作为记录,在 NAudio 中,Mark Heath 在 2014 年回答了这个问题。这是我的版本,将字节率除以字节的样本大小以获得采样频率,

using var reader = new WaveFileReader(fileName);
var byterate = reader.WaveFormat.AverageBytesPerSecond;

How to read Bit rate of .wav file in C#

【讨论】:

@unknown6656 感谢您的编辑。很久以前 !顺便说一句,我建议省略使用。或者把大括号放回去;)祝你改装愉快.. grtz 啊,你会吗?由于 C#8 中引入了using declaration-statements(参见docs.microsoft.com/en-us/dotnet/csharp/whats-new/…),放回大括号不会改变该语句的含义。我删除了大括号以减少代码行数并增强可读性.... 真的吗?在上述声明中(2017 年),读者将在分号处被解除分配.. 至少在 v7 中确实如此.. 很高兴知道发生了变化.. 是的,如果您使用using (var x = new Reader()) ;,这仍然是正确的。分号表示一个空的表达式语句。但是,如果您使用 using var x = new Reader();,则变量 x 只会在其生命周期和/或范围结束时被释放和处置。【参考方案2】:

您可以使用Bass Audio Library。它有 .NET 包装器,您可以获得峰值幅度和采样率。

【讨论】:

不幸的是,这对我也没有帮助:(【参考方案3】:

我过去使用 MathNET.Numerics 成功编写了一个 GUI。

【讨论】:

以上是关于python 问题。。。 对一个波形文件做fft,然后怎么获取那些频率分量? numpy有这个函数的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 NAudio 对波形文件执行 FFT

使用单片机和FFT算法显示波形(高分!!!急救!!)

Python科学计算——复杂信号FFT

裁剪 FFT 矩阵

分别对立体声信号的两个通道应用 FFT?

从波形文件中获取频率和幅度