gpt4 book ai didi

r - 如何将频谱图矩阵转换为WAV文件

转载 作者:行者123 更新时间:2023-12-02 23:01:21 29 4
gpt4 key购买 nike

有没有一种方法可以将表示灰度频谱图的矩阵(值不复杂且介于0和1之间)转换为声音文件,例如下图所示的图像,例如WAV文件? This post解释了如何使用seewave函数使用istft频谱图进行此操作。但是,就我而言,我看到有两个问题需要解决:

  • 原始频谱图(由signal::specgram获得)丢失并且矩阵尺寸与原始频谱图不同(即频率和时间都被上采样/下采样),而每一行和每一列的确切频率和时间值是已知的
  • 矩阵值的范围是0到1,并且不复杂,取决于istft

  • 此外,已知原始频谱图的尺寸,原始波对象的采样频率以及用于获得原始频谱图的窗口长度和重叠。
    谢谢!
    enter image description here

    最佳答案

    音频只是一条随时间摆动的曲线,其中该摆动反射(reflect)了您的鼓膜或麦克风拾音膜...该信号处于时域,其中轴是X上的时间,曲线高度是Y上的...典型的CD质量音频具有44,100个采样每秒意味着您捕获了该音频曲线上每秒的点数...捕获的是音频曲线的高度,而隐含的时间意味着知道每个样本都以已知的采样率进行捕获...因此采样率是数字音频上的两个关键音频属性...位深度是另一个属性...如果您花两个字节(16位)记录CD质量曲线高度,则会将2提升到16的幂(2 ^ 16 == 65536)不同的可能值来存储曲线高度
    强调原始音频信号的关键是在时域中(X是时间Y是曲线高度)...当您将一组这些样本发送到fft调用时,数据将转换到频域中(X是频率Y是幅度[能量]),因此时间的直接维度消失了,但仍融入了整个频域数据的概念……在决定同时馈入fft调用的两个样本数(样本窗口大小),即提高频率域信号的频率分辨率(以降低incr_freq),您需要更多音频样本才能馈入fft调用,但是要获得频率域中的时间特异性,您需要支付的样本尽可能少通过获得较低的频率分辨率和较低的峰值频率(较低的奈奎斯特极限)来实现
    要生成频谱图,您需要将该曲线高度数组(时域)的4096个样本的存储缓冲区馈入傅立叶变换(fft),该傅里叶变换将返回具有相同数量数组元素的数组(频率域),但是这次是每个元素存储一个复数,您可以根据该复数来计算幅度(能量水平)和相位...数组元素零是可以忽略的直流偏置...每个数组元素代表一个不同的频率,可以在其中计算频率增量

    with sample_rate of 44100 samples per second, and one second worth of samples ( 44100 )
    this gives you a frequency increment resolution of 1 hertz ... IE each freq bin is 1 Hertz apart

    incr_freq := sample_rate / number_of_samples

    nyquist_limit_index := int(number_of_samples / 2)
    这是您可以遍历数组complex_fft的方法(在go not r中)
    for index_fft, curr_complex := range complex_fft { // we really only use half this range + 1

    if index_fft <= nyquist_limit_index && curr_freq >= min_freq && curr_freq < max_freq {

    curr_real = real(curr_complex) // pluck out real portion of complex number
    curr_imag = imag(curr_complex) // ditto for imaginary portion

    curr_mag = 2.0 * math.Sqrt(curr_real*curr_real+curr_imag*curr_imag) / number_of_samples

    curr_theta = math.Atan2(curr_imag, curr_real)

    curr_dftt := discrete_fft{

    real: 2.0 * curr_real,
    imaginary: 2.0 * curr_imag,
    magnitude: curr_mag,
    theta: curr_theta,
    }
    随着时间的流逝,您重复上述将下一组4096个样本馈入fft api调用的过程,因此您收集了一组时域数组对及其对应的频率域表示形式
    创建绘图的过程执行了此重复过程,这就是为什么时间显示为X轴...在绘图上,每个垂直数据条代表单个fft调用的输出,其结果幅度显示为该垂直部分的暗部条形图上的条形图和较亮的点显示较低的能量频率...仅在生成随时间变化的图形的过程之后,才有可用数据绘制下一个垂直条形,因为图形从左到右进行,因此时间轴跨底部的X轴
    另一个重要的见识是要意识到您可以从音频(时域)开始...填充样本窗口(例如4096),然后将此数组发送到fft调用中,以获得一个新的频率数组(频率域),每个它的大小和相位...这是纯粹的魔术,然后您可以在此频率域阵列上执行傅立叶逆变换(ifft),以获得时域中与原始输入音频相匹配(近似于第一近似)的阵列信号
    因此,在您的情况下,在图表上从左到右遍历数据,并针对每组垂直幅度值(由灰度表示)(这是一个频域阵列)执行此傅里叶逆变换,它将为您提供原始音频信号(时间域)仅在非常短的时间段内(由4096个音频样本或类似的音频定义)...该原始音频是wav文件的有效负载部分...对下一个垂直数据列重复此过程,直到您从左到右遍历整个情节...将这一系列有效载荷缓冲区缝合到一个wav文件中

    关于r - 如何将频谱图矩阵转换为WAV文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64194542/

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