- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我知道这似乎是 ValueError 帖子中的另一篇,但请听我说完,并了解我已尝试使用 Google 搜索并浏览 StackOverflow 社区,以寻找可行的解决方案来解决我的问题。
我目前正在尝试将我的解调样本传递给 sounddevice 模块并使用它的回调函数实时播放它。
错误:
File "rtl-fm-cont.py", line 120, in audio_callback outdata[:] = data ValueError: could not broadcast input array from shape (2048) into shape (2048,1)
#!/usr/bin/env python
# library imports ...
parser = argparse.ArgumentParser(description=__doc__)
parser.add_argument('-d', '--device', type=int_or_str,
help='output device (numeric ID or substring)')
parser.add_argument('-b', '--blocksize', type=int, default=2048,
help='block size (default: %(default)s)')
parser.add_argument(
'-q', '--buffersize', type=int, default=20,
help='number of blocks used for buffering (default: %(default)s)')
args = parser.parse_args()
if args.blocksize == 0:
parser.error('blocksize must not be zero')
if args.buffersize < 1:
parser.error('buffersize must be at least 1')
q = queue.Queue(maxsize=args.buffersize)
event = threading.Event()
device_index = RtlSdr.get_device_index_by_serial('00000001')
class fmDemodulator(object):
# Called for each updates
def __init__(self, sdr=None):
self.sdr = sdr if sdr else RtlSdr(device_index)
def Demod(self, *args):
Fs = self.sdr.sample_rate
# Fc = self.sdr.center_freq
# Read IQ samples
samples = self.sdr.read_samples(4*12*2048)
print ('Fetching {} IQ samples from SDR #{}'.format(len(samples), device_index))
# Convert sampled data into numpy array
x1 = np.array(samples).astype("complex64")
# Downmixed Baseband Signal (Adjust offset to be centered)
offsetFreq = 0 # already centered
fc1 = np.exp(-1.0j*2.0*np.pi* offsetFreq/Fs*np.arange(len(x1)))
x2 = x1 * fc1
# Filter and downsample the FM Radio Signal
bwFM = 200000 # approx. 170 kHz for a single channel
decRate = int(Fs/bwFM)
x3 = signal.decimate(x2, decRate)
newFs = Fs/decRate
### Demodulate 200kHz FM Signal
# Polar discriminator
y4 = x3[1:] * np.conj(x3[:-1])
x4 = np.angle(y4)
# The de-emphasis filter
# Given a signal 'x4' (in a numpy array) with sampling rate newFS
d = newFs * 75e-6 # Calculate the # of samples to hit the -3dB point
x = np.exp(-1/d) # Calculate the decay between each sample
b = [1-x] # Create the filter coefficients
a = [1,-x]
x5 = signal.lfilter(b,a,x4)
# Find a decimation rate to achieve audio sampling rate between 44-48 kHz
audioFreq = 44100
dec_audio = int(newFs/audioFreq)
audioFs = newFs/dec_audio
x6 = signal.decimate(x5, dec_audio)
# Scale audio to adjust volume
x6 *= 10000 / np.max(np.abs(x6))
# debug
print ('decRate: {}, newFs : {}, dec_audio: {}'.format(decRate, newFs, dec_audio))
print ('Output audio: {} samples, audioFreq: {}, audioFs: {}'.format(len(x6), audioFreq, audioFs))
return x6
# https://python-sounddevice.readthedocs.io/en/0.3.6/examples.html
def audio_callback(outdata, frames, time, status):
"""This is called (from a separate thread) for each audio block."""
assert frames == args.blocksize
if status.output_underflow:
print('Output underflow: increase blocksize?', file=sys.stderr)
raise sd.CallbackAbort
assert not status
try:
data = q.get_nowait()
print(data)
print(data.dtype)
except queue.Empty:
print('Buffer is empty: increase buffersize?', file=sys.stderr)
raise sd.CallbackAbort
if len(data) < len(outdata):
outdata[:len(data)] = data
outdata[len(data):] = b'\x00' * (len(outdata) - len(data))
raise sd.CallbackStop
else:
outdata[:] = data
def main():
sdr = RtlSdr(device_index)
fm = fmDemodulator(sdr)
# SDR Configurations
sdr.sample_rate = int(2.4e6) # Hz
sdr.center_freq = int(102e6) # Hz
sdr.freq_correction = 77 # PPM +- 20
sdr.gain = 'auto'
samplerate = 50000
channels = 1
try:
for _ in range(args.buffersize):
data = fm.Demod()
if not np.any(data):
break
q.put_nowait(data) # pre-fill queue
stream = sd.OutputStream(
samplerate=samplerate, blocksize=args.blocksize,
device=args.device, channels=channels, dtype='int16',
callback=audio_callback, finished_callback=event.set)
with stream:
timeout = args.blocksize * args.buffersize / samplerate
while np.any(data): # while data
data = fm.Demod()
q.put(data, timeout=timeout)
event.wait() # Wait until playback is finished
except KeyboardInterrupt:
parser.exit('\nInterrupted by user')
except queue.Full:
# A timeout occured, i.e. there was an error in the callback
parser.exit(1)
except Exception as e:
parser.exit(type(e).__name__ + ': ' + str(e))
Output audio: 2048 samples, audioFreq: 44100, audioFs: 50000.0
Fetching 98304 IQ samples from SDR #0
...
Fetching 98304 IQ samples from SDR #0
decRate: 12, newFs : 200000.0, dec_audio: 4
Output audio: 2048 samples, audioFreq: 44100, audioFs: 50000.0
Fetching 98304 IQ samples from SDR #0
[ 627.05045796 1835.36815837 3381.16496121 ... 401.43836645
-1156.07050642 -1291.0900775 ]
float64
From cffi callback <function _StreamBase.__init__.<locals>.callback_ptr at 0x10eabbea0>:
Traceback (most recent call last):
File "/Users/user/.local/lib/python3.6/site-packages/sounddevice.py", line 741, in callback_ptr
return _wrap_callback(callback, data, frames, time, status)
File "/Users/user/.local/lib/python3.6/site-packages/sounddevice.py", line 2517, in _wrap_callback
decRate: 12, newFs : 200000.0, dec_audio: 4
Output audio: 2048 samples, audioFreq: 44100, audioFs: 50000.0
callback(*args)
File "rtl-fm-cont.py", line 120, in audio_callback
outdata[:] = data
ValueError: could not broadcast input array from shape (2048) into shape (2048,1)
Fetching 98304 IQ samples from SDR #0
decRate: 12, newFs : 200000.0, dec_audio: 4
Output audio: 2048 samples, audioFreq: 44100, audioFs: 50000.0
最佳答案
关于python - Sounddevice ValueError : could not broadcast input array from shape (2048) into shape (2048, 1),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53786945/
我可以从我的麦克风中播放音频,但声音非常低沉,老实说,这听起来像是程序要崩溃了。 我尝试使用 InputStream,但播放时声音很糟糕,知道我做错了什么吗? 10 是我的麦克风,而 13 是我的输出
我想编写一个程序,让我可以用电脑键盘播放样本声音,几乎没有延迟。 我的程序: import numpy as np import sounddevice as sd import soundfile
我目前有 2 个适合输入的音频编解码器,我想同时录制它们而不是顺序录制。 这就是我看到我的设备的方式: import sounddevice as sd sd.querydevices() 输出:
我正在使用Python sounddevice和 PySoundFile以“困难的方式”播放音频,即使用非阻塞回调。 (向https://stackoverflow.com/users/500098/
我正在编写一个程序来通过网络流式传输音频,所以我有一个线程来记录数据和一个发送数据。测试音频时有明显的差距。我相信这是由于 sounddevice.play() 函数造成的,下面的示例也有同样的问题。
需要帮忙 我想要的是 : 我想录制麦克风并从 txt 文件中获取持续时间 代码: import sounddevice as sd import numpy as np import scipy.io
我使用了以下代码来使用 sounddevice 播放音频文件 import sounddevice as sd import numpy as np (fs1, x) = read('Traffic_
我试图让我的音频接口(interface)连续循环播放相同的音频。有人推荐使用 sounddevice 库中的“OutputStream”函数。这是我为此编写的代码: sounddevice.defa
我目前正在编写一个脚本,该脚本应该能够将 8 个音频 channel (.wav 文件)输出到声卡上的 8 个不同 channel 。我的脚本有点工作,但我有同步问题。我能够听到播放期间 channe
我似乎无法弄清楚为什么我的代码不会产生 fft由 sounddevice.rec() 制成的 numpy 数组我能够让代码与音频文件一起使用,但不能与sounddevice 的数据 这是我的代码: i
我正在使用 python 库 sounddevice用于一些音频处理。当我使用 Stream 类将从输入设备(麦克风)收集的输入数据传递到输出时,回调函数有一个表示声音数据的 NumPy 数组: de
我有在 raspberry pi B++ 上运行的 python 代码,它使用 sounddevice 库,让您可以使用 python 播放和录制声音。我已经成功安装了模块。我可以通过 python
我编写了一个实验,向参与者展示了一系列视觉刺激(刺激持续时间:100 毫秒,试验持续时间:500 毫秒)。在视觉刺激开始的同时,会播放 100 毫秒的声音。 一些视觉刺激是目标,参与者在检测到目标时应
当我尝试运行示例 Google AI 时,出现以下错误,如 Configure and Run the sample 所示- (env) pi@raspberrypi:~ $ python -m go
我使用的是 Focusrite Scarlett 18i20 音频接口(interface),我需要使用至少 4 个输入来记录脉冲响应。我在 Windows 10 PC 上运行,使用 python (
我真的不了解有关如何实现 Sounddevice Stream 方法的正确格式或代码结构。我想创建一个基本缓冲区,它几乎实时地写入要在回调中读取的数组数据。我希望能够通过与流集成的线程查询来更改声波的
我知道这似乎是 ValueError 帖子中的另一篇,但请听我说完,并了解我已尝试使用 Google 搜索并浏览 StackOverflow 社区,以寻找可行的解决方案来解决我的问题。 我目前正在尝试
我是一名优秀的程序员,十分优秀!