如何从 python 中的 wav 文件获取频率和时间数据帧?
How can I get a dataframe of frequency and time from a wav file in python?
我已经能够使用 librosa 读取一个 wave 文件,但是能够得到一个缺少最重要部分的频率和振幅列表 "Time",我不知道如何去做周围
import librosa
from matplotlib import pyplot as plt
from librosa import display
import seaborn as sns
sns.set() # Use seaborn's default style to make attractive graphs
plt.rcParams['figure.dpi'] = 100 # Show nicely large images in this notebook
samples, sampling_rate = librosa.load('last.aac')
plt.figure(figsize=(13,4))
librosa.display.waveplot(y = samples, sr = sampling_rate)
plt.xlabel("Time (Seconds)")
plt.ylabel("Amplitude")
plt.title("Time Domain Frequency")
plt.show()
print("sampling rate is :", sampling_rate)
print("Number of samples :", len(samples))
max1 = max(samples*10)
print("Maximum amplitude", round(max1, 2))
min1 = min(samples*10)
print("Minimum amplitude", round(min1, 2))
import pandas as pd
d=pd.DataFrame(samples,columns=["Amplitudes"], index=None)
d.head()
Amplitudes frequencies
0.091039 2756.813965
-0.040613 2427.044189
-0.046945 2347.927002
-0.136473 2323.757080
0.050659 2317.414062
我真正想提取的是下面这个
Time Frequency Amplitude
0 0.00000 -57.72730
0 21.53320 -63.55554
0 43.06641 -85.05077
0 64.59961 -91.29989
0 86.13281 -83.86144
0 107.66602 -81.54240
如果您有采样率(以赫兹为单位),您可以使用它在几秒钟内创建一个索引。这是一个使用 4 秒音频文件的示例。
import librosa
import pandas as pd
y,sr = librosa.load('myfile.wav')
df = pd.DataFrame(y, columns=['Amplitude'])
df.index = [(1/sr)*i for i in range(len(df.index))]
print(df.head())
print(df.tail())
输出:
Amplitude
0.000000 -0.004855
0.000045 -0.007008
0.000091 -0.005919
0.000136 -0.006276
0.000181 -0.005805
Amplitude
3.999773 0.000892
3.999819 0.000765
3.999864 0.000543
3.999909 0.000428
3.999955 0.000216
索引现在以秒为单位。
请注意,示例中未显示 Frequencies
列的位置,所有绘图内容与问题无关,因此您应该 trim 其中一些用于在 SO 上发布问题。
我已经能够使用 librosa 读取一个 wave 文件,但是能够得到一个缺少最重要部分的频率和振幅列表 "Time",我不知道如何去做周围
import librosa
from matplotlib import pyplot as plt
from librosa import display
import seaborn as sns
sns.set() # Use seaborn's default style to make attractive graphs
plt.rcParams['figure.dpi'] = 100 # Show nicely large images in this notebook
samples, sampling_rate = librosa.load('last.aac')
plt.figure(figsize=(13,4))
librosa.display.waveplot(y = samples, sr = sampling_rate)
plt.xlabel("Time (Seconds)")
plt.ylabel("Amplitude")
plt.title("Time Domain Frequency")
plt.show()
print("sampling rate is :", sampling_rate)
print("Number of samples :", len(samples))
max1 = max(samples*10)
print("Maximum amplitude", round(max1, 2))
min1 = min(samples*10)
print("Minimum amplitude", round(min1, 2))
import pandas as pd
d=pd.DataFrame(samples,columns=["Amplitudes"], index=None)
d.head()
Amplitudes frequencies
0.091039 2756.813965
-0.040613 2427.044189
-0.046945 2347.927002
-0.136473 2323.757080
0.050659 2317.414062
我真正想提取的是下面这个
Time Frequency Amplitude
0 0.00000 -57.72730
0 21.53320 -63.55554
0 43.06641 -85.05077
0 64.59961 -91.29989
0 86.13281 -83.86144
0 107.66602 -81.54240
如果您有采样率(以赫兹为单位),您可以使用它在几秒钟内创建一个索引。这是一个使用 4 秒音频文件的示例。
import librosa
import pandas as pd
y,sr = librosa.load('myfile.wav')
df = pd.DataFrame(y, columns=['Amplitude'])
df.index = [(1/sr)*i for i in range(len(df.index))]
print(df.head())
print(df.tail())
输出:
Amplitude
0.000000 -0.004855
0.000045 -0.007008
0.000091 -0.005919
0.000136 -0.006276
0.000181 -0.005805
Amplitude
3.999773 0.000892
3.999819 0.000765
3.999864 0.000543
3.999909 0.000428
3.999955 0.000216
索引现在以秒为单位。
请注意,示例中未显示 Frequencies
列的位置,所有绘图内容与问题无关,因此您应该 trim 其中一些用于在 SO 上发布问题。