Gstreamer放大特定频率

问题描述

我需要将音量调到特定频率(或频率范围)。我最近得到的是将audiochebbandband-reject一起使用。样本管道为:

gst-launch-1.0 audiotestsrc wave=9 samplesperbuffer=44100 num-buffers=30 volume=0.05 ! \
audio/x-raw,channels=2 ! audioconvert ! \
audiochebband lower-frequency=980 upper-frequency=1000 mode="band-reject" type=1 ripple=60 ! \
vorbisenc ! oggmux ! filesink location=amp.ogg

它给了我一些“一些”结果。查看频谱图后,在给定频率进行初始放大后会有一个很大的截止点。

Bad plot spectrum

我需要的结果是,例如,如果您在audacidy内部使用均衡器,则选择两个频率之间的点并向上移动点。

Good plot spectrum

编辑: 为了说明我的要求,这里有一个简单的python脚本,可读取wav文件并放大频率范围。

from __future__ import print_function,division
import wave
import numpy as np
import time

start_time = time.time()
wr = wave.open('input-file.wav','r')
par = list(wr.getparams()) # Get the parameters from the input.
# This file is stereo,2 bytes/sample,44.1 kHz.
par[3] = 0 # The number of samples will be set by writeframes.

# Open the output file
ww = wave.open('output-file.wav','w')
ww.setparams(tuple(par)) # Use the same parameters as the input file.

lowcut = 980 # Select frequencies from.
highcut = 1000 # Select frequencies to.

sz = wr.getframerate() # Read and process 1 second at a time.
c = int(wr.getnframes()/sz) # whole file
for num in range(c):
    print('Processing {}/{} s'.format(num+1,c))
    da = np.frombuffer(wr.readframes(sz),dtype=np.int16)
    left,right = da[0::2],da[1::2] # left and right channel
    lf,rf = np.fft.rfft(left),np.fft.rfft(right)
    lf[lowcut:highcut] *= 2
    rf[lowcut:highcut] *= 2
    nl,nr = np.fft.irfft(lf),np.fft.irfft(rf)
    ns = np.column_stack((nl,nr)).ravel().astype(np.int16)
    ww.writeframes(ns.tostring())
# Close the files.
wr.close()
ww.close()

print("--- %s seconds ---" % (time.time() - start_time))

产生噪声,并将其用作脚本的输入文件,可以在选定的范围内获得完美的增益。

解决方法

是的。它必须是用户可配置的。范围从1到n。 对一个或两个频率使用此方法,结果可以,因为 由文档“某些频率可能会放大”,但范围更广 它只会放大前几个和最后一个。我知道 均衡器nbands(或3,10 ...),但我无法微调放大 因为所有波段范围都是以这种方式放大的。

以下仅是一个建议(我无法测试,因为我没有设置),但是当您成功使用一个或两个频率时,也许您可​​以使用多个调用将您打算的频率子集放大为不同的输出/ streams,然后将输出混合到单个流/文件中。

例如,说您需要放大980-2000。让我们从您所说的内容开始:

gst-launch-1.0 audiotestsrc wave=9 samplesperbuffer=44100 num-buffers=30 volume=0.05 ! \
audio/x-raw,channels=2 ! audioconvert ! \
audiochebband lower-frequency=980 upper-frequency=1000 mode="band-reject" type=1 ripple=60 ! \
vorbisenc ! oggmux ! filesink location=amp.ogg

在上面的示例中,您指定980-1000。

您可以为以下项分别调用:

1000-1020
1020-1040
....
1980-2000

所有输出到不同的文件。

然后,您可以使用以下类似的方法通过添加数据将多个流混合为一个流:

https://gstreamer.freedesktop.org/documentation/audiomixer/audiomixer.html?gi-language=c

或:

https://gstreamer.freedesktop.org/documentation/adder/index.html?gi-language=c