【问题标题】:A problem with value sliders, they are interfering with each other值滑块的问题,它们相互干扰
【发布时间】:2019-12-15 06:21:02
【问题描述】:

我有一个通过 Flask 网络服务器运行的拨号音 python 代码,我的代码中有几个变量,我试图通过 roundSlider 小部件进行控制。我面临的问题是,当我启动程序时,它运行正常,我可以通过我的第一个滑块平滑地控制 sample_rate 变量,并且在拖动第一个滑块时可以听到不同的音调。但是当我开始拖动第二个滑块以更改幅度值时,它确实会发生变化(开始听到嘈杂的静态声音),但同时它将采样率音调/声音重置为原始值(尽管这并不意味着它会改变第一个滑块视觉/动态)。 请看一下我的代码,看看您是否可以帮助我。

app.py 代码:

from __future__ import print_function
from gnuradio import analog
from gnuradio import audio
from gnuradio import blocks
from gnuradio import eng_notation
from gnuradio import gr
from gnuradio.eng_option import eng_option
from gnuradio.filter import firdes
from optparse import OptionParser


class TopBlock22(gr.top_block): # PEP8: CamelCaseName for classes

    def __init__(self, sample_rate=32000, amplitude=0):

        gr.top_block.__init__(self, "Top Block 22")        
        ##################################################
        # Variables
        ##################################################
        self.sample_rate = sample_rate
        print('[TopBlock22] __init__: sample_rate:', self.sample_rate)
        self.amplitude = amplitude
        print('[TopBlock22] __init__: amplitude:', self.amplitude)


        ##################################################
        # Blocks
        ##################################################
        self.blocks_add_xx = blocks.add_vff(1)
        self.audio_sink = audio.sink(32000, '', True)
        self.analog_sig_source_x_1 = analog.sig_source_f(sample_rate, analog.GR_COS_WAVE, 440,  amplitude, 0)
        self.analog_sig_source_x_0 = analog.sig_source_f(sample_rate, analog.GR_COS_WAVE, 350, amplitude, 0)
        self.analog_noise_source_x_0 = analog.noise_source_f(analog.GR_GAUSSIAN,  amplitude, -42)

        ##################################################
        # Connections
        ##################################################
        self.connect((self.analog_noise_source_x_0, 0), (self.blocks_add_xx, 2))
        self.connect((self.analog_sig_source_x_0, 0), (self.blocks_add_xx, 0))
        self.connect((self.analog_sig_source_x_1, 0), (self.blocks_add_xx, 1))
        self.connect((self.blocks_add_xx, 0), (self.audio_sink, 0))

    def change(self, sample_rate, amplitude):
        self.sample_rate = sample_rate
        print('[TopBlock22] __init__: sample_rate:', self.sample_rate)
        self.analog_sig_source_x_1.set_sampling_freq(self.sample_rate)
        self.analog_sig_source_x_0.set_sampling_freq(self.sample_rate)

    # def set_amplitude(self, amplitude):
        self.amplitude = amplitude
        print('[TopBlock22] __init__: amplitude:', self.amplitude)
        self.analog_sig_source_x_1.set_amplitude(self.amplitude)
        self.analog_sig_source_x_0.set_amplitude(self.amplitude)
        self.analog_noise_source_x_0.set_amplitude(self.amplitude)





        # lock
        self.lock()

        # disconect - needs two endpoints (not like in FAQ)
        self.disconnect((self.analog_sig_source_x_0, 0), (self.blocks_add_xx, 0))
        self.disconnect((self.analog_sig_source_x_1, 0), (self.blocks_add_xx, 1))

        # create new
        self.analog_sig_source_x_1 = analog.sig_source_f(sample_rate, analog.GR_COS_WAVE, 440, 0.4, 0)
        self.analog_sig_source_x_0 = analog.sig_source_f(sample_rate, analog.GR_COS_WAVE, 350, 0.4, 0)

        # connect again
        self.connect((self.analog_sig_source_x_0, 0), (self.blocks_add_xx, 0))
        self.connect((self.analog_sig_source_x_1, 0), (self.blocks_add_xx, 1))

        # unlock
        self.unlock()

# -----------------------------------------------------------------------------

from flask import Flask, request, jsonify


app = Flask(__name__)

tb = None  # global variable to keep it between requests


@app.route('/')
def index():
    return '''<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>GNURadio Slider Example</title>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
  <link href="https://cdnjs.cloudflare.com/ajax/libs/roundSlider/1.3.2/roundslider.min.css" rel="stylesheet" />
  <script src="https://cdnjs.cloudflare.com/ajax/libs/roundSlider/1.3.2/roundslider.min.js"></script>

</head>
<body>

<style>

#slider1 {
 position:absolute;
 top:100px;
 left:75px;
 align:center;
}
#slider2 {
 position:absolute;
 top:100px;
 left:470px;
  align:center;
}
#slider3 {
 position:absolute;
 top:100px;
 left:870px;
  align:center;
}
#slider4 {
 position:absolute;
 top:450px;
 left:75px;
  align:center;

}
#slider5 {
 position:absolute;
 top:450px;
 left:470px;
  align:center;
}
#slider6 {
 position:absolute;
 top:450px;
 left:870px;
  align:center;
}

</style>


</head>
<body>

<div id="slider1"></div>
<!--  <p>Sample Rate Slider</p> -->

<script>

  // keep slider's value
  var val;

  // create slider
  $("#slider1").roundSlider({
    radius: 150,

    min: 0,
    max: 10000000000,
    value: 0, // default value at start
    change: function () {
      var obj = $("#slider1").data("roundSlider");
      val = obj.getValue();
      $.getJSON('/valueofslider', {
        slide1_val: val

      });
    }
  });

  // play sound at start
  $.getJSON('/valueofslider', {slide_val: val});

</script>
<div id="slider2"></div>
<!--  <p>Amplitude Slider2</p> -->
<script>

  // keep slider's value
  var val;

  // create slider
  $("#slider2").roundSlider({
    radius: 150,
    min: 0,
    max: 10000000000,
    value: 0, // default value at start
    change: function () {
      var obj = $("#slider2").data("roundSlider");
      val = obj.getValue();
      $.getJSON('/valueofslider', {
        slide2_val: val

      });
    }
  });

  // play sound at start
  $.getJSON('/valueofslider', {slide_val: val});

</script>
<div id="slider3"></div>
 <!-- <p>Frequency Slider3</p> -->

<script>

  // keep slider's value
  var val;

  // create slider
  $("#slider3").roundSlider({
    radius: 150,
    min: 0,
    max: 10000000000,
    value: 0, // default value at start
    change: function () {
      var obj = $("#slider3").data("roundSlider");
      val = obj.getValue();
      $.getJSON('/valueofslider', {
        slide3_val: val

      });
    }
  });

  // play sound at start
  $.getJSON('/valueofslider', {slide_val: val});

</script>
<div id="slider4"></div>
 <!-- <p>Slider4</p>  -->

<script>

  // keep slider's value
  var val;

  // create slider
  $("#slider4").roundSlider({
    radius: 150,
    min: 0,
    max: 10000000000,
    value: 0, // default value at start
    change: function () {
      var obj = $("#slider").data("roundSlider");
      val = obj.getValue();
      $.getJSON('/valueofslider', {
        slide4_val: val

      });
    }
  });

  // play sound at start
  $.getJSON('/valueofslider', {slide_val: val});

</script>
<div id="slider5"></div>
<!--  <p>Slider5</p>  -->

<script>

  // keep slider's value
  var val;

  // create slider
  $("#slider5").roundSlider({
    radius: 150,
    min: 0,
    max: 10000000000,
    value: 0, // default value at start
    change: function () {
      var obj = $("#slider").data("roundSlider");
      val = obj.getValue();
      $.getJSON('/valueofslider', {
        slide5_val: val

      });
    }
  });

  // play sound at start
  $.getJSON('/valueofslider', {slide_val: val});

</script>
<div id="slider6"></div>
<!--  <p>Slider6</p>   -->

<script>

  // keep slider's value
  var val;

  // create slider
  $("#slider6").roundSlider({
    radius: 150,
    min: 0,
    max: 10000000000,
    value: 0, // default value at start
    change: function () {
      var obj = $("#slider").data("roundSlider");
      val = obj.getValue();
      $.getJSON('/valueofslider', {
        slide6_val: val

      });
    }
  });

  // play sound at start
  $.getJSON('/valueofslider', {slide_val: val});

</script>

</body>
</html>'''

# @app.route('/test')
# def test():
#     HTML = 'HEAR:'
#     for item in (0, 10000, 20000, 25000, 32000):
#         HTML += ' <a href="/set/{}">{}</a>'.format(item, item)
#     return HTML

# @app.route('/off')
# def off():
#     """Turn off sound."""
#     sound(0)
#     #return jsonify({'val': 0})
#     return 'off'

@app.route('/set/<int:value>')
def set_value(value):
    """Set value. Use 0 to turn it off."""
    sound(value)
    #return jsonify({'val': value})
    return str(value)

@app.route('/get')
def get_value():
    """Get value. Returns 0 when turned off."""
    if tb:
        value = tb.sample_rate
        value = tb.amplitude
    else:
        value = 0
    #return jsonify({'val': value})
    return str(value)

@app.route('/valueofslider')
def slide():
    sample_rate = request.args.get('slide1_val', '32000')
    amplitude = request.args.get('slide2_val', '0')
    sample_rate = int(sample_rate)
    amplitude = int(amplitude)
    sound(sample_rate, amplitude)
    #return jsonify({'val': sample_rate})
    return str(sample_rate)
    return str(amplitude)

# def sound_old(sample_rate):
#     """version which doesn't use `change()`"""
#     global tb

#     print('[sound] sample_rate:', sample_rate)
#     sample_rate = int(sample_rate)

#     # stop old sound
#     if tb: # if tb is not None
#         tb.stop()
#         tb.wait()
#         tb = None 

    # create new sound (if not zero)
    if sample_rate > 0 & amplitude == 0:
            tb = TopBlock22(sample_rate, amplitude)
            tb.start()


def sound(sample_rate, amplitude):
    """version which uses `change()`"""
    global tb

    print('[sound] sample_rate:', sample_rate)
    sample_rate = int(sample_rate)
    print('[sound] amplitude:', amplitude)
    amplitude = int(amplitude)

    if tb: # if tb is not None
        if sample_rate > 0 & amplitude == 0 :
            tb.change(sample_rate, amplitude)

        else:        
            tb.stop()
            tb.wait()
            tb = None 

    # create new sound (if not zero)
    if not tb:
        if sample_rate > 0 & amplitude == 0:
            tb = TopBlock22(sample_rate, amplitude)
            tb.start()


if __name__ == '__main__':    
    app.run(debug=True, host='0.0.0.0')

更新:

from __future__ import print_function
from gnuradio import analog
from gnuradio import audio
from gnuradio import blocks
from gnuradio import eng_notation
from gnuradio import gr
from gnuradio.eng_option import eng_option
from gnuradio.filter import firdes
from optparse import OptionParser


class TopBlock22(gr.top_block): # PEP8: CamelCaseName for classes

    def __init__(self, sample_rate=32000, amplitude=0):

        gr.top_block.__init__(self, "Top Block 22")        
        ##################################################
        # Variables
        ##################################################
        self.sample_rate = sample_rate
        print('[TopBlock22] __init__: sample_rate:', self.sample_rate)

        self.amplitude = amplitude
        print('[TopBlock22] __init__: amplitude:', self.amplitude)
        ##################################################
        # Blocks
        ##################################################
        self.blocks_add_xx = blocks.add_vff(1)
        self.audio_sink = audio.sink(32000, '', True)
        self.analog_sig_source_x_1 = analog.sig_source_f(sample_rate, analog.GR_COS_WAVE, 440,  amplitude, 0)
        self.analog_sig_source_x_0 = analog.sig_source_f(sample_rate, analog.GR_COS_WAVE, 350, amplitude, 0)
        self.analog_noise_source_x_0 = analog.noise_source_f(analog.GR_GAUSSIAN,  amplitude, -42)

        ##################################################
        # Connections
        ##################################################
        self.connect((self.analog_noise_source_x_0, 0), (self.blocks_add_xx, 2))
        self.connect((self.analog_sig_source_x_0, 0), (self.blocks_add_xx, 0))
        self.connect((self.analog_sig_source_x_1, 0), (self.blocks_add_xx, 1))
        self.connect((self.blocks_add_xx, 0), (self.audio_sink, 0))

    def change(self, sample_rate, amplitude=0):
        self.sample_rate = sample_rate
        print('[TopBlock22] __init__: sample_rate:', self.sample_rate)
        self.analog_sig_source_x_1.set_sampling_freq(self.sample_rate)
        self.analog_sig_source_x_0.set_sampling_freq(self.sample_rate)


        self.amplitude = amplitude
        print('[TopBlock22] __init__: amplitude:', self.amplitude)
        self.analog_sig_source_x_1.set_amplitude(self.amplitude)
        self.analog_sig_source_x_0.set_amplitude(self.amplitude)
        self.analog_noise_source_x_0.set_amplitude(self.amplitude)



        # lock
        self.lock()

        # disconect - needs two endpoints (not like in FAQ)
        self.disconnect((self.analog_sig_source_x_0, 0), (self.blocks_add_xx, 0))
        self.disconnect((self.analog_sig_source_x_1, 0), (self.blocks_add_xx, 1))

        # create new
        self.analog_sig_source_x_1 = analog.sig_source_f(sample_rate, analog.GR_COS_WAVE, 440, 0.4, 0)
        self.analog_sig_source_x_0 = analog.sig_source_f(sample_rate, analog.GR_COS_WAVE, 350, 0.4, 0)

        # connect again
        self.connect((self.analog_sig_source_x_0, 0), (self.blocks_add_xx, 0))
        self.connect((self.analog_sig_source_x_1, 0), (self.blocks_add_xx, 1))

        # unlock
        self.unlock()

# -----------------------------------------------------------------------------

from flask import Flask, request, jsonify


app = Flask(__name__)

tb = None  # global variable to keep it between requests


@app.route('/')
def index():
    return '''<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>GNURadio Slider Example</title>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
  <link href="https://cdnjs.cloudflare.com/ajax/libs/roundSlider/1.3.2/roundslider.min.css" rel="stylesheet" />
  <script src="https://cdnjs.cloudflare.com/ajax/libs/roundSlider/1.3.2/roundslider.min.js"></script>

</head>
<body>

<style>

#slider1 {
 position:absolute;
 top:100px;
 left:75px;
 align:center;
}
#slider2 {
 position:absolute;
 top:100px;
 left:470px;
  align:center;
}
#slider3 {
 position:absolute;
 top:100px;
 left:870px;
  align:center;
}
#slider4 {
 position:absolute;
 top:450px;
 left:75px;
  align:center;

}
#slider5 {
 position:absolute;
 top:450px;
 left:470px;
  align:center;
}
#slider6 {
 position:absolute;
 top:450px;
 left:870px;
  align:center;
}

</style>


</head>
<body>

<div id="slider1"></div>
<!--  <p>Sample Rate Slider</p> -->

<script>

  // keep slider's value
  var val1;

  // create slider
  $("#slider1").roundSlider({
    radius: 150,

    min: 0,
    max: 10000000000,
    value: 0, // default value at start
    change: function () {
      var obj1 = $("#slider1").data("roundSlider");
      val1 = obj1.getValue();
      $.getJSON('/valueofslider', {
        slide1_val1: val1

      });
    }
  });

  // play sound at start
  $.getJSON('/valueofslider', {slide1_val: val1});

</script>
<div id="slider2"></div>
<!--  <p>Amplitude Slider2</p> -->
<script>

  // keep slider's value
  var val2;

  // create slider
  $("#slider2").roundSlider({
    radius: 150,
    min: 0,
    max: 10000000000,
    value: 0, // default value at start
    change: function () {
      var obj2 = $("#slider2").data("roundSlider");
      val2 = obj2.getValue();
      $.getJSON('/valueofslider', {
        slide2_val2: val2

      });
    }
  });

  // play sound at start
  $.getJSON('/valueofslider', {slide2_val: val2});

</script>
<div id="slider3"></div>
 <!-- <p>Frequency Slider3</p> -->

<script>

  // keep slider's value
  var val3;

  // create slider
  $("#slider3").roundSlider({
    radius: 150,
    min: 0,
    max: 10000000000,
    value: 0, // default value at start
    change: function () {
      var obj3 = $("#slider3").data("roundSlider");
      val3 = obj3.getValue();
      $.getJSON('/valueofslider', {
        slide3_val3: val3

      });
    }
  });

  // play sound at start
  $.getJSON('/valueofslider', {slide3_val: val});

</script>
<div id="slider4"></div>
 <!-- <p>Slider4</p>  -->

<script>

  // keep slider's value
  var val4;

  // create slider
  $("#slider4").roundSlider({
    radius: 150,
    min: 0,
    max: 10000000000,
    value: 0, // default value at start
    change: function () {
      var obj4 = $("#slider").data("roundSlider");
      val4 = obj4.getValue();
      $.getJSON('/valueofslider', {
        slide4_val4: val4

      });
    }
  });

  // play sound at start
  $.getJSON('/valueofslider', {slide4_val: val});

</script>
<div id="slider5"></div>
<!--  <p>Slider5</p>  -->

<script>

  // keep slider's value
  var val5;

  // create slider
  $("#slider5").roundSlider({
    radius: 150,
    min: 0,
    max: 10000000000,
    value: 0, // default value at start
    change: function () {
      var obj5 = $("#slider").data("roundSlider");
      val5 = obj5.getValue();
      $.getJSON('/valueofslider', {
        slide5_val5: val5

      });
    }
  });

  // play sound at start
  $.getJSON('/valueofslider', {slide5_val: val});

</script>
<div id="slider6"></div>
<!--  <p>Slider6</p>   -->

<script>

  // keep slider's value
  var val;

  // create slider
  $("#slider6").roundSlider({
    radius: 150,
    min: 0,
    max: 10000000000,
    value: 0, // default value at start
    change: function () {
      var obj6 = $("#slider").data("roundSlider");
      val6 = obj6.getValue();
      $.getJSON('/valueofslider', {
        slide6_val6: val6

      });
    }
  });

  // play sound at start
  $.getJSON('/valueofslider', {slide6_val: val});

</script>

</body>
</html>'''



@app.route('/set/<int:value>')
def set_value(value):
    """Set value. Use 0 to turn it off."""
    sound(value)
    #return jsonify({'val': value})
    return str(value)

@app.route('/get')
def get_value():
    """Get value. Returns 0 when turned off."""
    if tb:
        value = tb.sample_rate
        value = tb.amplitude
    else:
        value = 0
    #return jsonify({'val': value})
    return str(value)

@app.route('/valueofslider')
def slide():
    sample_rate = request.args.get('slide1_val1', '32000')
    sample_rate = int(sample_rate)
    return str(sample_rate)

    if sample_rate > 0:
            tb = TopBlock22(sample_rate)
            tb.start()


def slide():

    amplitude = request.args.get('slide2_val2', '0')
    amplitude = int(amplitude)
    sound(sample_rate, amplitude)
    return str(amplitude)

    if amplitude == 0:
            tb = TopBlock22(amplitude)
            tb.start()

def sound(sample_rate, amplitude):
    """version which uses `change()`"""
    global tb

    print('[sound] sample_rate:', sample_rate)
    sample_rate = int(sample_rate)
    print('[sound] amplitude:', amplitude)
    amplitude = int(amplitude)

    if tb: # if tb is not None
        if sample_rate > 0 & amplitude == 0 :
            tb.change(sample_rate, amplitude)

        else:        
            tb.stop()
            tb.wait()
            tb = None 

    # create new sound (if not zero)
    if not tb:
        if sample_rate > 0 & amplitude == 0:
            tb = TopBlock22(sample_rate, amplitude)
            tb.start()


if __name__ == '__main__':    
    app.run(debug=True, host='0.0.0.0')

【问题讨论】:

  • 当您只发送幅度时,它也会将采样率更改为 32000,因为有 sample_rate = request.args.get('slide1_val', '32000')。最好设置为None,然后使用此 None 作为通知不要更改此值。或者更好地为滑块创建分离函数,并在类 TopBlock22 中分离函数。这样,您将始终只使用一个值。
  • @furas,我更新了我的代码(上图),并在 TopBlock22 类中为滑块和分离函数创建了单独的函数,但我没有得到任何输出。
  • 你不能有两个同名的方法。你应该得到错误。 __init__ 应该只有一个 - 它只在开始时设置值。您不能有两个 change - 函数需要不同的名称 - 即。 change_ampliture, change_sample_rate.
  • 在 JavaScript 中,您对所有滑块使用相同的变量 - val - 它们必须使用具有不同名称的变量。
  • @furas,我更新并重新发布了它,仍然没有声音!

标签: javascript python html ajax webserver


【解决方案1】:

TopBlock22 中,我有两种方法:change_sample_rate()change_amplitude(),所以我只能更改一个值,而不关心其他值。

在烧瓶中,我有两个名称和网址不同的函数

@app.route('/set_sample_rate/<int:value>')
def set_sample_rate(value):
    tb.change_sample_rate(value)
    return str(value)

@app.route('/set_amplitude/<int:value>')
def set_amplitude(value):
    tb.change_amplitude(value)
    return str(value)

其中一个使用TopBlock22.change_sample_rate() 更改采样率,其他使用TopBlock22.change_amplitude() 更改幅度。这样每个 url 只改变一个值,而不关心其他值。

每个切片器都使用不同的 url 来发送值。这样每个切片器只改变一个值而不关心其他值。


我减少了一些东西以使其更简单。

首先,我在开始时创建 TopBlock22() 的实例,并且在值为零时不将其删除 - 所以我不必检查它是否存在并重新创建它。

我还减少了 JavaScript 中的代码。它不使用全局变量来保存值。它使用event.value 从切片器中获取价值。

我还减少了 CSS。我使用类 row1row2col1col2col3 将相同的值(顶部、左侧)保留在一个类中。

我添加了“关闭”按钮,该按钮将零发送到服务器并更改切片器中的值,以便它们移动到起始位置。它使用旧函数 /valueofslicesound()tb.change() 一次更改所有值。它使用None 来控制更改哪个值,因此它也可以只更改其中一个值而不关心其他值。


from __future__ import print_function
from gnuradio import analog
from gnuradio import audio
from gnuradio import blocks
from gnuradio import eng_notation
from gnuradio import gr
from gnuradio.eng_option import eng_option
from gnuradio.filter import firdes
from optparse import OptionParser


class TopBlock22(gr.top_block): # PEP8: CamelCaseName for classes

    def __init__(self, sample_rate=32000, amplitude=0, frequency=0):

        gr.top_block.__init__(self, "Top Block 22")
        ##################################################
        # Variables
        ##################################################
        self.sample_rate = sample_rate
        print('[TopBlock22] __init__: sample_rate:', self.sample_rate)

        self.amplitude = amplitude
        print('[TopBlock22] __init__: amplitude:', self.amplitude)

        self.frequency = frequency
        print('[TopBlock22] __init__: frequency:', self.frequency)

        # for mute_on, mute_off
        #self.old_sample_rate = self.sample_rate
        #self.old_ampliture = self.ampliture
        #self.old_frequency = self.frequency

        ##################################################
        # Blocks
        ##################################################
        self.blocks_add_xx = blocks.add_vff(1)
        self.audio_sink = audio.sink(32000, '', True)
        self.analog_sig_source_x_1 = analog.sig_source_f(sample_rate, analog.GR_COS_WAVE, 440,  amplitude, 0)
        self.analog_sig_source_x_0 = analog.sig_source_f(sample_rate, analog.GR_COS_WAVE, 350, amplitude, 0)
        self.analog_noise_source_x_0 = analog.noise_source_f(analog.GR_GAUSSIAN,  amplitude, -42)

        ##################################################
        # Connections
        ##################################################
        self.connect((self.analog_noise_source_x_0, 0), (self.blocks_add_xx, 2))
        self.connect((self.analog_sig_source_x_0, 0), (self.blocks_add_xx, 0))
        self.connect((self.analog_sig_source_x_1, 0), (self.blocks_add_xx, 1))
        self.connect((self.blocks_add_xx, 0), (self.audio_sink, 0))

    def change_sample_rate(self, value=None):
        if value is not None:
            self.sample_rate = value
            print('[TopBlock22] change: sample_rate:', value)
            self.analog_sig_source_x_1.set_sampling_freq(value)
            self.analog_sig_source_x_0.set_sampling_freq(value)

    def change_amplitude(self, value=None):
        if value is not None:
            value /= 10000.
            self.amplitude = value
            print('[TopBlock22] change: amplitude:', value)
            self.analog_sig_source_x_1.set_amplitude(value)
            self.analog_sig_source_x_0.set_amplitude(value)
            self.analog_noise_source_x_0.set_amplitude(value)

    def change_frequency(self, value=None):
        if value is not None:
            self.frequency = value
            print('[TopBlock22] change: frequency:', value)
            #TODO: change some values

    def change(self, sample_rate=None, amplitude=None, frequency=None):
        #self.change_sample_rate(sample_rate)
        #self.change_amplitude(amplitude)
        #self.change_frequency(frequency)

        if sample_rate is not None:
            self.change_sample_rate(sample_rate)

        if amplitude is not None:
            self.change_amplitude(amplitude)

        if frequency is not None:
            self.change_frequency(frequency)

    def turn_off(self):
        self.change(0, 0, 0)

    #def mute_on(self):
    #    # remember values
    #    self.old_sample_rate = self.sample_rate
    #    self.old_ampliture = self.ampliture
    #    self.old_frequency = self.frequency
    #    # turn off sound
    #    self.change(0, 0, 0)

    #def mute_off(self):
    #    # set old values
    #    self.change(self.old_sample_rate, self.old_ampliture, self.old_frequency)

# -----------------------------------------------------------------------------

from flask import Flask, request, jsonify

app = Flask(__name__)

# start with default values 
#tb = TopBlock22()
tb = TopBlock22(0, 0, 0)
tb.start()


@app.route('/')
def index():
    return '''<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>GNURadio Slider Example</title>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
  <link href="https://cdnjs.cloudflare.com/ajax/libs/roundSlider/1.3.2/roundslider.min.css" rel="stylesheet" />
  <script src="https://cdnjs.cloudflare.com/ajax/libs/roundSlider/1.3.2/roundslider.min.js"></script>

<style>

.slider {
 position: absolute;
 align:center;
}    

.row1 {top:100px;}
.row2 {top:450px;}

.col1 {left:75px;}
.col2 {left:470px;}
.col3 {left:870px;}

</style>
</head>

<body>

<div id="slider1" class='slider row1 col1'></div>
<!--  <p>Sample Rate Slider</p> -->

<div id="slider2" class='slider row1 col2'></div>
<!--  <p>Amplitude Slider2</p> -->

<div id="slider3" class='slider row1 col3'></div>
<!-- <p>Frequency Slider3</p> -->

<div id="slider4" class='slider row2 col1'></div>
<!-- <p>Slider4</p>  -->

<div id="slider5" class='slider row2 col2'></div>
<!-- <p>Slider5</p>  -->

<div id="slider6" class='slider row2 col3'></div>
<!-- <p>Slider6</p>  -->

<button id="turn_off_button">TURN OFF</button>

<script>

  // create sliders

  $("#slider1").roundSlider({
    radius: 150,
    min: 0,
    max: 10000,
    value: 0, // default value at start
    //change: function(event) { $.getJSON('/valueofslider', {slide1_val: event.value}); }
    change: function(event) { $.getJSON('/set_sample_rate/' + event.value); }
  });

  $("#slider2").roundSlider({
    radius: 150,
    min: 0,
    max: 10000,
    value: 0, // default value at start
    //change: function(event) { $.getJSON('/valueofslider', {slide2_val: event.value}); }
    change: function(event) { $.getJSON('/set_amplitude/' + event.value); }
  });

  $("#slider3").roundSlider({
    radius: 150,
    min: 0,
    max: 10000000000,
    value: 0, // default value at start
    //change: function(event) { $.getJSON('/valueofslider', {slide3_val: event.value}); }
    change: function(event) { $.getJSON('/set_frequency/' + event.value); }
  });

  $("#slider4").roundSlider({
    radius: 150,
    min: 0,
    max: 10000000000,
    value: 0, // default value at start
    change: function(event) { $.getJSON('/valueofslider', {slide4_val: event.value}); }
  });

  $("#slider5").roundSlider({
    radius: 150,
    min: 0,
    max: 10000000000,
    value: 0, // default value at start
    change: function(event) { $.getJSON('/valueofslider', {slide5_val: event.value}); }
  });

  $("#slider6").roundSlider({
    radius: 150,
    min: 0,
    max: 10000000000,
    value: 0, // default value at start
    change: function (event) { $.getJSON('/valueofslider', {slide6_val: event.value}); }
  });

  $("#turn_off_button").click(function(){
      // set sliders
      $("#slider1").data("roundSlider").setValue(0);
      $("#slider2").data("roundSlider").setValue(0);
      $("#slider3").data("roundSlider").setValue(0);

      // send to server
      $.getJSON('/valueofslider', {
        slide1_val: 0,
        slide2_val: 0,
        slide3_val: 0,
      });
  });

</script>

</body>
</html>'''

@app.route('/off')
def off():
    """Turn off sound."""
    tb.turn_off()
    #return jsonify({'val': 0})
    return 'off'

@app.route('/set_sample_rate/<int:value>')
def set_sample_rate(value):
    #sound(sample_rate=value)
    tb.change_sample_rate(value)
    #return jsonify({'sample_rate': value})
    return str(value)

@app.route('/set_amplitude/<int:value>')
def set_amplitude(value):
    #sound(amplitude=value)
    tb.change_amplitude(value)
    #return jsonify({'amplitude': value})
    return str(value)

@app.route('/set_frequency/<int:value>')
def set_frequency(value):
    #sound(frequency=value)
    tb.change_frequency(value)
    #return jsonify({'frequency': value})
    return str(value)


@app.route('/valueofslider')
def slide():
    sample_rate = request.args.get('slide1_val', None)
    amplitude   = request.args.get('slide2_val', None)
    frequency   = request.args.get('slide3_val', None)

    sound(
        sample_rate=sample_rate, 
        amplitude=amplitude, 
        frequency=frequency,
    )

    #return jsonify({
    #        'sample_rate': sample_rate, 
    #        'amplitude': amplitude,
    #        'frequency ': frequency ,
    #        })

    return 'sample_rate: {}, amplitude: {}, frequency : {}'.format(sample_rate, amplitude, frequency )

def sound(sample_rate=None, amplitude=None, frequency=None):
    """version which uses `change()`"""

    if sample_rate is not None:
        sample_rate = int(sample_rate)
        tb.change_sample_rate(sample_rate)

    if amplitude is not None:
        amplitude = int(amplitude)
        tb.change_amplitude(amplitude)

    if frequency is not None:
        frequency = int(frequency )
        tb.change_frequency(frequency )

    print('[sound] sample_rate:', sample_rate)
    print('[sound] amplitude:', amplitude)
    print('[sound] frequency:', frequency)

    #if tb: # if tb is not None
    #    tb.change(sample_rate, amplitude, frequency)

if __name__ == '__main__':
    app.run(host='0.0.0.0', debug=True)

【讨论】:

  • 再次感谢您的大力帮助!太感谢了!我正在尝试运行代码,但听不到提示音​​!
  • 振幅为 0 时我不听音。当 sample_rate 为 0 时可能相同。我必须移动两个切片器才能听到音调。当它使用错误的值时也可能出现问题。 amplitude 可能必须在 [0,1] 范围内浮动数字,因此我使用 value /= 10000. 来获得此范围 [0,1] 内的幅度。 10000. 中有一个点来创建浮点数。对于整数值 1000,此 value /= 10000 在 Python 2 中将始终为零。
  • 哦,我明白了,我将重新研究我的 GRC 流程图并检查变量值并从那里开始。非常感谢!
  • 我的下一个主题可能是关于“set_waveform”功能的。如果您在我发布此主题后帮助我,我将不胜感激。在过去的几天里,我没有尝试过使用它,因为老实说,我不知道该怎么做。如您所知,我的意思是 gnuradio 中的波形菜单有字符串变量列表(常量、余弦、正弦、平方...),我不知道如何将它们包含在我的代码中。但我会努力做到最好!
  • 我刚刚收到了一些关于我的任务的更新,我觉得我在这里感到困惑!请看一下并告诉我这是否与我所做的相去甚远:SDR Python 代码需要能够输出用户可选择的波形,该波形可以是 CW 音调、宽带噪声或从包含以下文件的文件中读取的任意波形I/Q 值。对于所有这些波形,用户输入应包括工作频率和带宽(CW 除外 - 仅频率)。对于 I/Q 文件,用户需要指定其他参数:样本数和采样率(可能更多)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-27
  • 1970-01-01
  • 2013-04-27
  • 1970-01-01
  • 2023-01-31
  • 1970-01-01
相关资源
最近更新 更多