首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AttributeError:模块‘峰度’没有属性'Kurtosis_c‘

AttributeError:模块‘峰度’没有属性'Kurtosis_c‘
EN

Stack Overflow用户
提问于 2022-05-17 05:37:40
回答 1查看 140关注 0票数 2

我试图建立一个使用gr_modtool的快速傅立叶变换和峰度能力的接收器块。

代码本身可以编译而没有错误。

但是,当我在GRC中运行流图时,它会产生以下错误消息。

代码语言:javascript
复制
Generating: '/home/nomo/gr-Kurtosis/kurtosis.py'

Executing: /usr/bin/python3 -u /home/nomo/gr-Kurtosis/kurtosis.py

Traceback (most recent call last):
  File "/home/nomo/gr-Kurtosis/kurtosis.py", line 134, in <module>
    main()
  File "/home/nomo/gr-Kurtosis/kurtosis.py", line 112, in main
    tb = top_block_cls()
  File "/home/nomo/gr-Kurtosis/kurtosis.py", line 81, in __init__
    self.Kurtosis_Kurtosis_c_0 = Kurtosis.Kurtosis_c(1024)
AttributeError: module 'Kurtosis' has no attribute 'Kurtosis_c'

下面是实现源文件:

代码语言:javascript
复制
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif

#include <gnuradio/io_signature.h>
#include "Kurtosis_c_impl.h"

namespace gr {
  namespace Kurtosis {

    Kurtosis_c::sptr
    Kurtosis_c::make(int fftsize)
    {
      return gnuradio::get_initial_sptr
        (new Kurtosis_c_impl(fftsize));
    }


    /*
     * The private constructor
     */
    Kurtosis_c_impl::Kurtosis_c_impl(int fftsize)
      : gr::sync_block("Kurtosis_c",
              gr::io_signature::make(1, 1, sizeof(gr_complex)),
              gr::io_signature::make(0, 0, 0)),
              d_N(fftsize)
    {
      d_input = (fftw_complex*)fftw_malloc(sizeof(gr_complex) * d_N);
      K = (fftw_complex*)fftw_malloc(sizeof(gr_complex) * d_N);
      d_plan = fftw_plan_dft_1d(d_N, d_input, d_input, FFTW_BACKWARD, FFTW_ESTIMATE);
    }

    /*
     * Our virtual destructor.
     */
    Kurtosis_c_impl::~Kurtosis_c_impl()
    {
    }

    int
    Kurtosis_c_impl::work(int noutput_items,
        gr_vector_const_void_star &input_items,
        gr_vector_void_star &output_items)
    {
      const gr_complex *in = (const gr_complex*) input_items[0];

      for(int i = 0; i < noutput_items; i++)
      {
        d_input[i][0] = in[i].real();
        d_input[i][1] = in[i].imag();
      }
      
      fftw_execute(d_plan);
      
      for(int i = 0; i < noutput_items ;i++)
      {   
        S1[i][0] = S1[i][0] + d_input[i][0];
        S1[i][1] = S1[i][1] + d_input[i][1];
        
        S2[i][0] = S2[i][0] + d_input[i][0] * d_input[i][0];
        S2[i][1] = S2[i][1] + d_input[i][1] * d_input[i][1];
        
        S3[i][0] = S3[i][0] + d_input[i][0] * d_input[i][0] * d_input[i][0];
        S3[i][1] = S3[i][1] + d_input[i][1] * d_input[i][1] * d_input[i][1];
        
        S4[i][0] = S4[i][0] + d_input[i][0] * d_input[i][0] * d_input[i][0] * d_input[i][0];
        S4[i][1] = S4[i][1] + d_input[i][1] * d_input[i][1] * d_input[i][1] * d_input[i][1];
        
        dc[i][0] = dc[i][0] + 1;
        dc[i][1] = dc[i][1] + 1;
      }
    
      for(int i = 0; i < noutput_items; i++)
      {
        Myu1[i][0] = S1[i][0] / dc[i][0];
        Myu1[i][1] = S1[i][1] / dc[i][1];
      
        Myu2[i][0] = S2[i][0] / dc[i][0];
        Myu2[i][1] = S2[i][1] / dc[i][1];
      
        Myu3[i][0] = S3[i][0] / dc[i][0];
        Myu3[i][1] = S3[i][1] / dc[i][1];
      
        Myu4[i][0] = S4[i][0] / dc[i][0];
        Myu4[i][1] = S4[i][1] / dc[i][1];
      }

    

      for(int i = 0; i < noutput_items; i++)
      {
        K[i][0] = (Myu4[i][0] - 4 * Myu3[i][0] * Myu1[i][0] + 6 * Myu2[i][0] * Myu1[i][0] 
                   * Myu1[i][0] - 3 * Myu1[i][0] * Myu1[i][0] * Myu1[i][0] * Myu1[i][0]) / 
                    ((Myu2[i][0] - Myu1[i][0] * Myu1[i][0]) * (Myu2[i][0] - Myu1[i][0] 
                      * Myu1[i][0]));
      
        K[i][1] = (Myu4[i][1] - 4 * Myu3[i][1] * Myu1[i][1] + 6 * Myu2[i][1] * Myu1[i][1] 
                   * Myu1[i][1] - 3 * Myu1[i][1] * Myu1[i][1] * Myu1[i][1] * Myu1[i][1]) / 
                    ((Myu2[i][1] - Myu1[i][1] * Myu1[i][1]) * (Myu2[i][1] - Myu1[i][1] 
                      * Myu1[i][1]));
      }

      // Tell runtime system how many output items we produced.
      return noutput_items;
    }

  } /* namespace Kurtosis1 */
} /* namespace gr */

实现头文件如下:

代码语言:javascript
复制
#ifndef INCLUDED_KURTOSIS1_KURTOSIS_C1_IMPL_H
#define INCLUDED_KURTOSIS1_KURTOSIS_C1_IMPL_H

#include <Kurtosis/Kurtosis_c.h>
#include <fftw3.h>

namespace gr {
  namespace Kurtosis {

    class Kurtosis_c_impl : public Kurtosis_c
    {
     private:
       int d_N;
       
        
       fftw_complex *K;
       fftw_complex *S1;
       fftw_complex *S2;
       fftw_complex *S3; 
       fftw_complex *S4;
       fftw_complex *Myu1;
       fftw_complex *Myu2;
       fftw_complex *Myu3;
       fftw_complex *Myu4;
       fftw_complex *dc;
       
   
      
       fftw_complex *d_input;
       fftw_plan     d_plan;

     public:
      Kurtosis_c_impl(int fftsize);
      ~Kurtosis_c_impl();
     

      // Where all the action really happens
      int work(
              int noutput_items,
              gr_vector_const_void_star &input_items,
              gr_vector_void_star &output_items
      );
    };

  } // namespace Kurtosis1
} // namespace gr

#endif /* INCLUDED_KURTOSIS1_KURTOSIS_C1_IMPL_H */

在GRC中运行流图时会生成以下python代码

代码语言:javascript
复制
from distutils.version import StrictVersion

if __name__ == '__main__':
    import ctypes
    import sys
    if sys.platform.startswith('linux'):
        try:
            x11 = ctypes.cdll.LoadLibrary('libX11.so')
            x11.XInitThreads()
        except:
            print("Warning: failed to XInitThreads()")

from gnuradio import blocks
import pmt
from gnuradio import gr
from gnuradio.filter import firdes
import sys
import signal
from PyQt5 import Qt
from argparse import ArgumentParser
from gnuradio.eng_arg import eng_float, intx
from gnuradio import eng_notation
import Kurtosis
from gnuradio import qtgui

class kurtosis(gr.top_block, Qt.QWidget):

    def __init__(self):
        gr.top_block.__init__(self, "Not titled yet")
        Qt.QWidget.__init__(self)
        self.setWindowTitle("Not titled yet")
        qtgui.util.check_set_qss()
        try:
            self.setWindowIcon(Qt.QIcon.fromTheme('gnuradio-grc'))
        except:
            pass
        self.top_scroll_layout = Qt.QVBoxLayout()
        self.setLayout(self.top_scroll_layout)
        self.top_scroll = Qt.QScrollArea()
        self.top_scroll.setFrameStyle(Qt.QFrame.NoFrame)
        self.top_scroll_layout.addWidget(self.top_scroll)
        self.top_scroll.setWidgetResizable(True)
        self.top_widget = Qt.QWidget()
        self.top_scroll.setWidget(self.top_widget)
        self.top_layout = Qt.QVBoxLayout(self.top_widget)
        self.top_grid_layout = Qt.QGridLayout()
        self.top_layout.addLayout(self.top_grid_layout)

        self.settings = Qt.QSettings("GNU Radio", "kurtosis")

        try:
            if StrictVersion(Qt.qVersion()) < StrictVersion("5.0.0"):
                self.restoreGeometry(self.settings.value("geometry").toByteArray())
            else:
                self.restoreGeometry(self.settings.value("geometry"))
        except:
            pass

        ##################################################
        # Variables
        ##################################################
        self.samp_rate = samp_rate = 32000

        ##################################################
        # Blocks
        ##################################################
        self.blocks_throttle_0 = blocks.throttle(gr.sizeof_gr_complex*1, samp_rate,True)
        self.blocks_file_source_0 = blocks.file_source(gr.sizeof_gr_complex*1, '/home/nomo/gr-Kurtosis/b200_220215_0718_30_40_6000_TEST.dat', True, 0, 0)
        self.blocks_file_source_0.set_begin_tag(pmt.PMT_NIL)
        self.Kurtosis_Kurtosis_c_0 = Kurtosis.Kurtosis_c(1024)



        ##################################################
        # Connections
        ##################################################
        self.connect((self.blocks_file_source_0, 0), (self.blocks_throttle_0, 0))
        self.connect((self.blocks_throttle_0, 0), (self.Kurtosis_Kurtosis_c_0, 0))

    def closeEvent(self, event):
        self.settings = Qt.QSettings("GNU Radio", "kurtosis")
        self.settings.setValue("geometry", self.saveGeometry())
        event.accept()

    def get_samp_rate(self):
        return self.samp_rate

    def set_samp_rate(self, samp_rate):
        self.samp_rate = samp_rate
        self.blocks_throttle_0.set_sample_rate(self.samp_rate)



def main(top_block_cls=kurtosis, options=None):

    if StrictVersion("4.5.0") <= StrictVersion(Qt.qVersion()) < StrictVersion("5.0.0"):
        style = gr.prefs().get_string('qtgui', 'style', 'raster')
        Qt.QApplication.setGraphicsSystem(style)
    qapp = Qt.QApplication(sys.argv)

    tb = top_block_cls()
    tb.start()
    tb.show()

    def sig_handler(sig=None, frame=None):
        Qt.QApplication.quit()

    signal.signal(signal.SIGINT, sig_handler)
    signal.signal(signal.SIGTERM, sig_handler)

    timer = Qt.QTimer()
    timer.start(500)
    timer.timeout.connect(lambda: None)

    def quitting():
        tb.stop()
        tb.wait()
    qapp.aboutToQuit.connect(quitting)
    qapp.exec_()


if __name__ == '__main__':
    main()

问:如何解决这个错误?

预先感谢您所能提供的任何指导。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-05-20 12:21:58

有两个可能的原因:

  1. 您没有在系统上安装swig,并且无法生成python绑定。

#包括

  1. 您没有链接所有外部库- fftw3 (在您的例子中).

打开顶级CMakeLists.txt并添加

代码语言:javascript
复制
find_package(FFTW3)

然后打开lib/CMakeLists.txt并将fftw3::fftw3添加到target_link_libraries列表中,如下所示

代码语言:javascript
复制
target_link_libraries(gnuradio-Kurtosis PUBLIC
  gnuradio::gnuradio-runtime fftw3::fftw3 
)

还有一件事是改进错误处理--打开python/__init__.py并将ImportError更改为ModuleNotFoundError

在所有这些更改之后,您需要重新安装OOT模块。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72268662

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档