codecamp

AI人工智能 表征音频信号:转换到频域

表征音频信号涉及将时域信号转换到频域,并理解其频率分量。这是一个重要步骤,因为它提供了关于信号的大量信息。您可以使用傅里叶变换等数学工具来执行此转换。

示例

以下示例逐步展示了如何使用 Python 表征存储在文件中的信号。请注意,这里我们使用傅里叶变换数学工具将其转换到频域。

导入必要的包,如下所示:

import numpy as np
import matplotlib.pyplot as plt
from scipy.io import wavfile

现在,读取存储的音频文件。它将返回两个值:采样频率和音频信号。提供音频文件存储的路径,如下所示:

frequency_sampling, audio_signal = wavfile.read("/Users/admin/sample.wav")

在这一步中,我们将使用以下命令显示音频信号的采样频率、信号的数据类型及其持续时间等参数:

print('\nSignal shape:', audio_signal.shape)
print('Signal Datatype:', audio_signal.dtype)
print('Signal duration:', round(audio_signal.shape[0] /
float(frequency_sampling), 2), 'seconds')

在这一步中,我们需要对信号进行归一化,如下所示:

audio_signal = audio_signal / np.power(2, 15)

这一步涉及提取信号的长度和半长。为此,使用以下命令:

length_signal = len(audio_signal)
half_length = np.ceil((length_signal + 1) / 2.0).astype(np.int)

现在,我们需要应用数学工具转换到频域。这里我们使用傅里叶变换:

signal_frequency = np.fft.fft(audio_signal)

现在,对频域信号进行归一化并平方:

signal_frequency = abs(signal_frequency[0:half_length]) / length_signal
signal_frequency **= 2

接下来,提取频率变换后信号的长度和半长:

len_fts = len(signal_frequency)

请注意,傅里叶变换后的信号必须针对偶数和奇数情况进行调整:

if length_signal % 2:
    signal_frequency[1:len_fts] *= 2
else:
    signal_frequency[1:len_fts-1] *= 2

现在,提取分贝(dB)单位的功率:

signal_power = 10 * np.log10(signal_frequency)

调整 X 轴的频率为 kHz:

x_axis = np.arange(0, half_length, 1) * (frequency_sampling / length_signal) / 1000.0

现在,可视化信号的表征:

plt.figure()
plt.plot(x_axis, signal_power, color='black')
plt.xlabel('Frequency (kHz)')
plt.ylabel('Signal power (dB)')
plt.show()

您可以观察到上述代码的输出图表,如下所示:

AI人工智能 可视化音频信号 - 从文件读取并进行处理
AI人工智能 生成单音音频信号
温馨提示
下载编程狮App,免费阅读超1000+编程语言教程
取消
确定
目录

AI人工智能监督学习(回归)

关闭

MIP.setData({ 'pageTheme' : getCookie('pageTheme') || {'day':true, 'night':false}, 'pageFontSize' : getCookie('pageFontSize') || 20 }); MIP.watch('pageTheme', function(newValue){ setCookie('pageTheme', JSON.stringify(newValue)) }); MIP.watch('pageFontSize', function(newValue){ setCookie('pageFontSize', newValue) }); function setCookie(name, value){ var days = 1; var exp = new Date(); exp.setTime(exp.getTime() + days*24*60*60*1000); document.cookie = name + '=' + value + ';expires=' + exp.toUTCString(); } function getCookie(name){ var reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)'); return document.cookie.match(reg) ? JSON.parse(document.cookie.match(reg)[2]) : null; }