使用libjpeg-turbo进行JPG编解码-YUV422P转JPG为例

原创 嵌入式Lee 2023-08-10 17:15

.前言

   在UVC项目中需要测试MJPEG的传输, 通常JPG使用的是YUV420采样压缩,恰好有个UVC的显示设备不支持YUV420采样压缩,只支持YUV422采样压缩,所以需要生成YUV422采样压缩的JPG文件用于测试。于是使用libjpeg代码库生成。这里使用libjpeg-turbo,相对官方的libjpeg,其使用了SIMD进行了速度优化,并且进一步封装了接口,接口更简洁更方便使用。

   关于YUV422YUV420采样的JPG,以下文章有更详细的说明,总的来说YUV420更常见,毕竟都有损压缩了,使用YUV422带来的质量提升已经没什么意义了,使用YUV420空间更小,质量差异不大。https://calendar.perfplanet.com/2015/why-arent-your-images-using-chroma-subsampling/

项目见: https://github.com/libjpeg-turbo/libjpeg-turbo.git

https://libjpeg-turbo.org/

libjpeg:http://www.ijg.org/files/

以下基于WSL+Ubuntu环境进行。

.下载代码

lhj@lhj:~$ git clone https://github.com/libjpeg-turbo/libjpeg-turbo.git

Cloning into 'libjpeg-turbo'...remote: Enumerating objects: 19401, done.remote: Counting objects: 100% (432/432), done.remote: Compressing objects: 100% (199/199), done.remote: Total 19401 (delta 259), reused 325 (delta 219), pack-reused 18969Receiving objects: 100% (19401/19401), 17.02 MiB | 10.70 MiB/s, done.Resolving deltas: 100% (14372/14372), done.

进入目录查看文件如下

lhj@lhj:~$ cd libjpeg-turbo/

lhj@lhj:~/libjpeg-turbo$ ls

BUILDING.md        fuzz          jconfig.txt      jdhuff.c    jfdctfst.c          jstdhuff.c      tjexampletest.inCMakeLists.txt     jaricom.c     jconfigint.h.in  jdhuff.h    jfdctint.c          jutils.c        tjunittest.cChangeLog.md       java          jcparam.c        jdicc.c     jidctflt.c          jversion.h.in   tjutil.cLICENSE.md         jcapimin.c    jcphuff.c        jdinput.c   jidctfst.c          libjpeg.map.in  tjutil.hREADME.ijg         jcapistd.c    jcprepct.c       jdlhuff.c   jidctint.c          libjpeg.txt     transupp.cREADME.md          jcarith.c     jcsample.c       jdlossls.c  jidctred.c          md5             transupp.happveyor.yml       jccoefct.c    jcstest.c        jdmainct.c  jinclude.h          rdbmp.c         turbojpeg-jni.ccderror.h          jccolext.c    jctrans.c        jdmainct.h  jlossls.h           rdcolmap.c      turbojpeg-mapfilecdjpeg.c           jccolor.c     jdapimin.c       jdmarker.c  jmemmgr.c           rdgif.c         turbojpeg-mapfile.jnicdjpeg.h           jcdctmgr.c    jdapistd.c       jdmaster.c  jmemnobs.c          rdjpgcom.1      turbojpeg-mp.cchange.log         jcdiffct.c    jdarith.c        jdmaster.h  jmemsys.h           rdjpgcom.c      turbojpeg.ccjpeg.1            jchuff.c      jdatadst-tj.c    jdmerge.c   jmorecfg.h          rdppm.c         turbojpeg.hcjpeg.c            jchuff.h      jdatadst.c       jdmerge.h   jpeg_nbits_table.h  rdswitch.c      usage.txtdoxygen-extra.css  jcmaster.h    jdct.h           jerror.c    jsamplecomp.h       tjbench.c       wrtarga.cdoxygen.config     jcomapi.c     jddctmgr.c       jerror.h    jsimd.h             tjbenchtest.inexample.c          jconfig.h.in  jddiffct.c       jfdctflt.c  jsimddct.h          tjexample.c

lhj@lhj:~/libjpeg-turbo$ code .

.安装nasm

lhj@lhj:~/libjpeg-turbo$ sudo apt install nasm

[sudo] password for lhj:Reading package lists... DoneBuilding dependency treeReading state information... DoneThe following NEW packages will be installed:  nasm0 upgraded, 1 newly installed, 0 to remove and 224 not upgraded.Need to get 362 kB of archives.After this operation, 3374 kB of additional disk space will be used.Get:1 http://archive.ubuntu.com/ubuntu focal/universe amd64 nasm amd64 2.14.02-1 [362 kB]Fetched 362 kB in 2s (185 kB/s)Selecting previously unselected package nasm.(Reading database ... 131163 files and directories currently installed.)Preparing to unpack .../nasm_2.14.02-1_amd64.deb ...Unpacking nasm (2.14.02-1) ...Setting up nasm (2.14.02-1) ...Processing triggers for man-db (2.9.1-1) ...

.编译

lhj@lhj:~/libjpeg-turbo$ mkdir build

lhj@lhj:~/libjpeg-turbo$ cd build

lhj@lhj:~/libjpeg-turbo/build$ cmake ../

-- The C compiler identification is GNU 9.4.0-- Check for working C compiler: /usr/bin/cc-- Check for working C compiler: /usr/bin/cc -- works-- Detecting C compiler ABI info-- Detecting C compiler ABI info - done-- Detecting C compile features-- Detecting C compile features - done-- CMAKE_BUILD_TYPE = Release-- VERSION = 3.0.1, BUILD = 20230810-- 64-bit build (x86_64)-- CMAKE_INSTALL_PREFIX = /opt/libjpeg-turbo-- CMAKE_INSTALL_BINDIR = bin (/opt/libjpeg-turbo/bin)-- CMAKE_INSTALL_DATAROOTDIR =  (/opt/libjpeg-turbo)-- CMAKE_INSTALL_DOCDIR = doc (/opt/libjpeg-turbo/doc)-- CMAKE_INSTALL_INCLUDEDIR = include (/opt/libjpeg-turbo/include)-- CMAKE_INSTALL_LIBDIR = lib64 (/opt/libjpeg-turbo/lib64)-- CMAKE_INSTALL_MANDIR = man (/opt/libjpeg-turbo/man)-- Shared libraries enabled (ENABLE_SHARED = 1)-- Static libraries enabled (ENABLE_STATIC = 1)-- Arithmetic decoding support enabled (WITH_ARITH_DEC = 1)-- Arithmetic encoding support enabled (WITH_ARITH_ENC = 1)-- TurboJPEG API library enabled (WITH_TURBOJPEG = 1)-- TurboJPEG Java wrapper disabled (WITH_JAVA = 0)-- Emulating libjpeg API/ABI v6.2 (WITH_JPEG7 = 0, WITH_JPEG8 = 0)-- libjpeg API shared library version = 62.4.0-- Compiler flags =  -O3 -DNDEBUG-- Linker flags =-- Looking for sys/types.h-- Looking for sys/types.h - found-- Looking for stdint.h-- Looking for stdint.h - found-- Looking for stddef.h-- Looking for stddef.h - found-- Check size of size_t-- Check size of size_t - done-- Check size of unsigned long-- Check size of unsigned long - done-- Performing Test HAVE_BUILTIN_CTZL-- Performing Test HAVE_BUILTIN_CTZL - Success-- Performing Test RIGHT_SHIFT_IS_UNSIGNED-- Performing Test RIGHT_SHIFT_IS_UNSIGNED - Failed-- Performing Test INLINE_WORKS-- Performing Test INLINE_WORKS - Success-- INLINE = __inline__ __attribute__((always_inline)) (FORCE_INLINE = 1)-- Performing Test HAVE_THREAD_LOCAL-- Performing Test HAVE_THREAD_LOCAL - Success-- THREAD_LOCAL = __thread-- Performing Test HAVE_VERSION_SCRIPT-- Performing Test HAVE_VERSION_SCRIPT - Success-- Linker supports GNU-style version scripts-- CMAKE_EXECUTABLE_SUFFIX =-- Looking for a ASM_NASM compiler-- Looking for a ASM_NASM compiler - /usr/bin/nasm-- The ASM_NASM compiler identification is NASM-- Found assembler: /usr/bin/nasm-- CMAKE_ASM_NASM_COMPILER = /usr/bin/nasm-- CMAKE_ASM_NASM_OBJECT_FORMAT = elf64-- CMAKE_ASM_NASM_FLAGS =  -DELF -D__x86_64__ -DPIC-- SIMD extensions: x86_64 (WITH_SIMD = 1)-- FLOATTEST8 = sse-- FLOATTEST12 = no-fp-contract-- RPM architecture = x86_64, DEB architecture = amd64-- Configuring done-- Generating done-- Build files have been written to: /home/lhj/libjpeg-turbo/build

lhj@lhj:~/libjpeg-turbo/build$ make

Scanning dependencies of target simd[  0%] Building ASM_NASM object simd/CMakeFiles/simd.dir/x86_64/jsimdcpu.asm.o[  0%] Building ASM_NASM object simd/CMakeFiles/simd.dir/x86_64/jfdctflt-sse.asm.o[  0%] Building ASM_NASM object simd/CMakeFiles/simd.dir/x86_64/jccolor-sse2.asm.o[  0%] Building ASM_NASM object simd/CMakeFiles/simd.dir/x86_64/jcgray-sse2.asm.o[  1%] Building ASM_NASM object simd/CMakeFiles/simd.dir/x86_64/jchuff-sse2.asm.o[  1%] Building ASM_NASM object simd/CMakeFiles/simd.dir/x86_64/jcphuff-sse2.asm.o[  1%] Building ASM_NASM object simd/CMakeFiles/simd.dir/x86_64/jcsample-sse2.asm.o[  1%] Building ASM_NASM object simd/CMakeFiles/simd.dir/x86_64/jdcolor-sse2.asm.o[  1%] Building ASM_NASM object simd/CMakeFiles/simd.dir/x86_64/jdmerge-sse2.asm.o[  2%] Building ASM_NASM object simd/CMakeFiles/simd.dir/x86_64/jdsample-sse2.asm.o[  2%] Building ASM_NASM object simd/CMakeFiles/simd.dir/x86_64/jfdctfst-sse2.asm.o[  2%] Building ASM_NASM object simd/CMakeFiles/simd.dir/x86_64/jfdctint-sse2.asm.o[  2%] Building ASM_NASM object simd/CMakeFiles/simd.dir/x86_64/jidctflt-sse2.asm.o[  3%] Building ASM_NASM object simd/CMakeFiles/simd.dir/x86_64/jidctfst-sse2.asm.o[  3%] Building ASM_NASM object simd/CMakeFiles/simd.dir/x86_64/jidctint-sse2.asm.o[  3%] Building ASM_NASM object simd/CMakeFiles/simd.dir/x86_64/jidctred-sse2.asm.o[  3%] Building ASM_NASM object simd/CMakeFiles/simd.dir/x86_64/jquantf-sse2.asm.o[  3%] Building ASM_NASM object simd/CMakeFiles/simd.dir/x86_64/jquanti-sse2.asm.o[  4%] Building ASM_NASM object simd/CMakeFiles/simd.dir/x86_64/jccolor-avx2.asm.o[  4%] Building ASM_NASM object simd/CMakeFiles/simd.dir/x86_64/jcgray-avx2.asm.o[  4%] Building ASM_NASM object simd/CMakeFiles/simd.dir/x86_64/jcsample-avx2.asm.o[  4%] Building ASM_NASM object simd/CMakeFiles/simd.dir/x86_64/jdcolor-avx2.asm.o[  5%] Building ASM_NASM object simd/CMakeFiles/simd.dir/x86_64/jdmerge-avx2.asm.o[  5%] Building ASM_NASM object simd/CMakeFiles/simd.dir/x86_64/jdsample-avx2.asm.o[  5%] Building ASM_NASM object simd/CMakeFiles/simd.dir/x86_64/jfdctint-avx2.asm.o[  5%] Building ASM_NASM object simd/CMakeFiles/simd.dir/x86_64/jidctint-avx2.asm.o[  5%] Building ASM_NASM object simd/CMakeFiles/simd.dir/x86_64/jquanti-avx2.asm.o[  6%] Building C object simd/CMakeFiles/simd.dir/x86_64/jsimd.c.o[  6%] Built target simdScanning dependencies of target turbojpeg12
.......Scanning dependencies of target md5cmp[ 99%] Building C object md5/CMakeFiles/md5cmp.dir/md5cmp.c.o[100%] Building C object md5/CMakeFiles/md5cmp.dir/md5.c.o[100%] Building C object md5/CMakeFiles/md5cmp.dir/md5hl.c.o[100%] Linking C executable md5cmp[100%] Built target md5cmp

生成文件如下

lhj@lhj:~/libjpeg-turbo/build$ ls

CMakeCache.txt       cmake_uninstall.cmake  jconfigint.h     libjpeg.so             md5         tjbench-staticCMakeFiles           croptest               jcstest          libjpeg.so.62          pkgscripts  tjbenchtestCTestTestfile.cmake  djpeg                  jpegtran         libjpeg.so.62.4.0      rdjpgcom    tjexampleMakefile             djpeg-static           jpegtran-static  libturbojpeg.a         sharedlib   tjexampletestcjpeg                example                jversion.h       libturbojpeg.so        simd        tjunittestcjpeg-static         example-static         libjpeg.a        libturbojpeg.so.0      strtest     tjunittest-staticcmake_install.cmake  jconfig.h              libjpeg.map      libturbojpeg.so.0.3.0  tjbench     wrjpgcom

.安装

lhj@lhj:~/libjpeg-turbo/build$ sudo make install

安装于/opt/libjpeg-turbo/lib64

[sudo] password for lhj: [  6%] Built target simd[  7%] Built target turbojpeg12[ 10%] Built target jpeg16[ 16%] Built target jpeg12[ 17%] Built target turbojpeg16[ 31%] Built target turbojpeg[ 31%] Built target turbojpeg12-static[ 34%] Built target jpeg16-static[ 40%] Built target jpeg12-static[ 53%] Built target jpeg-static[ 54%] Built target djpeg12-static[ 54%] Built target djpeg16-static[ 56%] Built target djpeg-static[ 56%] Built target example-static[ 57%] Built target tjexample[ 57%] Built target turbojpeg16-static[ 71%] Built target turbojpeg-static[ 72%] Built target jpegtran-static[ 73%] Built target tjunittest-static[ 74%] Built target rdjpgcom[ 75%] Built target tjunittest[ 75%] Built target tjbench-static[ 76%] Built target cjpeg16-static[ 76%] Built target strtest[ 77%] Built target cjpeg12-static[ 79%] Built target cjpeg-static[ 80%] Built target wrjpgcom[ 81%] Built target tjbench[ 81%] Built target cjpeg12[ 81%] Built target cjpeg16[ 93%] Built target jpeg[ 94%] Built target cjpeg[ 94%] Built target djpeg16[ 94%] Built target djpeg12[ 96%] Built target djpeg[ 97%] Built target jpegtran[ 98%] Built target example[ 99%] Built target jcstest[100%] Built target md5cmpInstall the project...-- Install configuration: "Release"-- Installing: /opt/libjpeg-turbo/lib64/libturbojpeg.so.0.3.0-- Installing: /opt/libjpeg-turbo/lib64/libturbojpeg.so.0-- Set runtime path of "/opt/libjpeg-turbo/lib64/libturbojpeg.so.0.3.0" to "/opt/libjpeg-turbo/lib64"-- Installing: /opt/libjpeg-turbo/lib64/libturbojpeg.so-- Installing: /opt/libjpeg-turbo/bin/tjbench-- Set runtime path of "/opt/libjpeg-turbo/bin/tjbench" to "/opt/libjpeg-turbo/lib64"-- Installing: /opt/libjpeg-turbo/lib64/libturbojpeg.a-- Installing: /opt/libjpeg-turbo/include/turbojpeg.h-- Installing: /opt/libjpeg-turbo/lib64/libjpeg.a-- Installing: /opt/libjpeg-turbo/bin/rdjpgcom-- Set runtime path of "/opt/libjpeg-turbo/bin/rdjpgcom" to "/opt/libjpeg-turbo/lib64"-- Installing: /opt/libjpeg-turbo/bin/wrjpgcom-- Set runtime path of "/opt/libjpeg-turbo/bin/wrjpgcom" to "/opt/libjpeg-turbo/lib64"-- Installing: /opt/libjpeg-turbo/doc/README.ijg-- Installing: /opt/libjpeg-turbo/doc/README.md-- Installing: /opt/libjpeg-turbo/doc/example.c-- Installing: /opt/libjpeg-turbo/doc/tjexample.c-- Installing: /opt/libjpeg-turbo/doc/libjpeg.txt-- Installing: /opt/libjpeg-turbo/doc/structure.txt-- Installing: /opt/libjpeg-turbo/doc/usage.txt-- Installing: /opt/libjpeg-turbo/doc/wizard.txt-- Installing: /opt/libjpeg-turbo/doc/LICENSE.md-- Installing: /opt/libjpeg-turbo/man/man1/cjpeg.1-- Installing: /opt/libjpeg-turbo/man/man1/djpeg.1-- Installing: /opt/libjpeg-turbo/man/man1/jpegtran.1-- Installing: /opt/libjpeg-turbo/man/man1/rdjpgcom.1-- Installing: /opt/libjpeg-turbo/man/man1/wrjpgcom.1-- Installing: /opt/libjpeg-turbo/lib64/pkgconfig/libjpeg.pc-- Installing: /opt/libjpeg-turbo/lib64/pkgconfig/libturbojpeg.pc-- Installing: /opt/libjpeg-turbo/lib64/cmake/libjpeg-turbo/libjpeg-turboConfig.cmake-- Installing: /opt/libjpeg-turbo/lib64/cmake/libjpeg-turbo/libjpeg-turboConfigVersion.cmake-- Installing: /opt/libjpeg-turbo/lib64/cmake/libjpeg-turbo/libjpeg-turboTargets.cmake-- Installing: /opt/libjpeg-turbo/lib64/cmake/libjpeg-turbo/libjpeg-turboTargets-release.cmake-- Installing: /opt/libjpeg-turbo/include/jconfig.h-- Installing: /opt/libjpeg-turbo/include/jerror.h-- Installing: /opt/libjpeg-turbo/include/jmorecfg.h-- Installing: /opt/libjpeg-turbo/include/jpeglib.h-- Installing: /opt/libjpeg-turbo/lib64/libjpeg.so.62.4.0-- Installing: /opt/libjpeg-turbo/lib64/libjpeg.so.62-- Set runtime path of "/opt/libjpeg-turbo/lib64/libjpeg.so.62.4.0" to "/opt/libjpeg-turbo/lib64"-- Installing: /opt/libjpeg-turbo/lib64/libjpeg.so-- Installing: /opt/libjpeg-turbo/bin/cjpeg-- Set runtime path of "/opt/libjpeg-turbo/bin/cjpeg" to "/opt/libjpeg-turbo/lib64"-- Installing: /opt/libjpeg-turbo/bin/djpeg-- Set runtime path of "/opt/libjpeg-turbo/bin/djpeg" to "/opt/libjpeg-turbo/lib64"-- Installing: /opt/libjpeg-turbo/bin/jpegtran-- Set runtime path of "/opt/libjpeg-turbo/bin/jpegtran" to "/opt/libjpeg-turbo/lib64"

.测试

lhj@lhj:~/libjpeg-turbo/build$ sudo make test

Running tests...Test project /home/lhj/libjpeg-turbo/build        Start   1: tjunittest-shared  1/590 Test   #1: tjunittest-shared ...................................   Passed    3.48 sec        Start   2: tjunittest-shared-alloc  2/590 Test   #2: tjunittest-shared-alloc .............................   Passed    3.48 sec......        Start 590: example-12bit-static-decompress-cmp590/590 Test #590: example-12bit-static-decompress-cmp .................   Passed    0.00 sec
100% tests passed, 0 tests failed out of 590
Total Test time (real) = 79.40 sec

.YUV422PJPG

代码

#include #include #include #include #include #include #include 
/* Y = 0.298R + 0.612G + 0.117B;   [13,235] U = -0.168R - 0.330G + 0.498B + 128; [16,239] V = 0.449R - 0.435G - 0.083B + 128; [16,239]*/uint8_t* yuv422p(uint32_t w, uint32_t h, uint32_t color){    uint8_t* p = (uint8_t*)malloc(w*h*2);    uint8_t* ret = p;    if(p == NULL)    {        return NULL;    }
    int y = 0;    int u = 0;    int v = 0;    uint8_t r = 0;    uint8_t g = 0;    uint8_t b = 0;    r = (color >> 16) & 0xFF;    g = (color >> 8) & 0xFF;    b = (color >> 0) & 0xFF;    y = (0.298*r + 0.612*g + 0.117*b);    u = (-0.168*r - 0.330*g + 0.498*b + 128);    v = (0.449*r - 0.435*g - 0.083*b + 128);    if(y>235)    {        y=235;    }    if(y<16)    {        y=16;    }    if(u>239)    {        u=239;    }    if(u<16)    {        u=16;    }    if(v>239)    {        v=239;    }    if(v<16)    {        v=16;    }    for(int i=0;i    {        *p++ = y;    }    for(int i=0;i2;i++)    {        *p++ = u;    }    for(int i=0;i2;i++)    {        *p++ = v;    }    return ret;}
/*写内存到文件*/void write_buffer2file(char *filename, uint8_t *buffer, int size){  FILE *fd = fopen(filename,"wb");  if (NULL == fd) {    return;  }  fwrite(buffer,1,size,fd);  fclose(fd);}
int tyuv2jpeg(unsigned char* yuv_buffer, int yuv_size, int width, int height, int subsample, unsigned char** jpeg_buffer, unsigned long* jpeg_size, int quality,char *name){    tjhandle handle = NULL;    int flags = 0;    int padding = 16; // 1或4均可,但不能是0    int need_size = 0;    int ret = 0;     handle = tjInitCompress();       flags |= 0;     need_size = tjBufSizeYUV2(width, padding, height, subsample);    if (need_size != yuv_size)    {        printf("we detect yuv size: %d, but you give: %d, check again.\n", need_size, yuv_size);        return 0;    }     ret = tjCompressFromYUV(handle, yuv_buffer, width, padding, height, subsample, jpeg_buffer, jpeg_size, quality, flags);    if (ret < 0)    {        printf("compress to jpeg failed: %s\n", tjGetErrorStr());    }    write_buffer2file(name,*jpeg_buffer,*jpeg_size);    tjDestroy(handle);     return ret;}
int main(){    unsigned long jpeg_size;    unsigned char* yuv_buffer;    unsigned char* jpeg_buffer;    yuv_buffer = yuv422p(800, 480, 0xFFFF00);    tyuv2jpeg(yuv_buffer, 800*480*2, 800, 480, TJSAMP_422, &jpeg_buffer, &jpeg_size, 90, "out.jpg");    free(yuv_buffer);}

编译

gcc test.c -o test -lturbojpeg -I/opt/libjpeg-turbo/include -L/opt/libjpeg-turbo/lib64

运行

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/libjpeg-turbo/lib64 &&  ./test

生成out.jpg

八. 总结

   以上使用libjpeg实现了YUV422PJPG,可以导入自己项目用于UVCMJPEG测试。后面再单独讲将其移植到MCU以实现软jpg的编解码。



评论 (0)
  • ‌液氮恒温器‌是一种利用液氮作为冷源的恒温装置,主要用于提供低温、恒温或变温环境,广泛应用于科研、工业和医疗等领域。液氮恒温器通过液氮的低温特性来实现降温效果,具有效率高、降温速度快、振动小、成本低等优点。 ‌液氮恒温器应用场景和领域:‌科研领域‌:‌低温物理实验‌:用于研究材料在低温下的各种物理特性,如超导性、磁性、电学性质等。‌半导体研究‌:在半导体制造和测试过程中,需要低温环境以测试半导体材料和器件的性能。‌超导研究‌:测量超导材料的超导转变温度、临界电流密度等参数。‌材料科学‌
    锦正茂科技 2025-04-09 16:32 28浏览
  • 文/郭楚妤编辑/cc孙聪颖‍伴随贸易全球化的持续深入,跨境电商迎来蓬勃发展期,物流行业 “出海” 成为不可阻挡的必然趋势。加之国内快递市场渐趋饱和,存量竞争愈发激烈。在此背景下,国内头部快递企业为突破发展瓶颈,寻求新的增长曲线,纷纷将战略目光投向海外市场。2024 年,堪称中国物流企业出海进程中的关键节点,众多企业纷纷扬帆起航,开启海外拓展之旅。然而,在一片向好的行业发展表象下,部分跨境物流企业的经营状况却不容乐观。它们受困于激烈的市场竞争、不断攀升的运营成本,以及复杂的国际物流环境,陷入了微利
    华尔街科技眼 2025-04-09 15:15 124浏览
  • ‌亥姆霍兹线圈‌是由两组相同的线圈组成,线圈之间的距离等于它们的半径。当电流同时流过这两个线圈时,会在它们中间形成一个几乎均匀的磁场。这种设计克服了普通线圈磁场不均匀的缺陷,能够在中心区域形成稳定、均匀的磁场‌。‌亥姆霍兹线圈的应用领域‌包括材料、电子、生物、医疗、航空航天、化学、应用物理等各个学科。由于其操作简便且能够提供极微弱的磁场直至数百高斯的磁场,亥姆霍兹线圈在各研究所、高等院校及企业中被广泛用于物质磁性或检测实验。‌亥姆霍兹线圈可以根据不同的标准进行分类‌:‌按磁场方向分类‌:‌一维亥
    锦正茂科技 2025-04-09 17:20 47浏览
  •   卫星故障预警系统:守护卫星在轨安全的 “瞭望塔”   卫星故障预警系统作为保障卫星在轨安全运行的核心技术,集成多源数据监测、智能诊断算法与预警响应机制,实时监控卫星关键系统状态,精准预判故障。下面从系统架构、技术原理、应用场景以及发展趋势这四个关键维度展开深入解析。   应用案例   目前,已有多个卫星故障预警系统在实际应用中取得了显著成效。例如,北京华盛恒辉和北京五木恒润卫星故障预警系统。这些成功案例为卫星故障预警系统的推广和应用提供了有力支持。   系统架构与组成   卫星故障
    华盛恒辉l58ll334744 2025-04-09 17:18 42浏览
  • ‌亥姆霍兹线圈‌是由两组相同的线圈组成,线圈之间的距离等于它们的半径。当电流同时流过这两个线圈时,会在它们中间形成一个几乎均匀的磁场。这种设计克服了普通线圈磁场不均匀的缺陷,能够在中心区域形成稳定、均匀的磁场‌。‌亥姆霍兹线圈的应用领域‌包括材料、电子、生物、医疗、航空航天、化学、应用物理等各个学科。由于其操作简便且能够提供极微弱的磁场直至数百高斯的磁场,亥姆霍兹线圈在各研究所、高等院校及企业中被广泛用于物质磁性或检测实验。‌‌亥姆霍兹线圈的用途非常广泛,主要包括以下几个方面‌:‌粒子物理实验‌
    锦正茂科技 2025-04-09 17:04 40浏览
  •   卫星故障预警系统软件:卫星在轨安全的智能护盾   北京华盛恒辉卫星故障预警系统软件,作为确保卫星在轨安全运行的关键利器,集成前沿的监测、诊断及预警技术,对卫星健康状况予以实时评估,提前预判潜在故障。下面将从核心功能、技术特性、应用场景以及发展走向等方面展开详尽阐述。   应用案例   目前,已有多个卫星故障预警系统在实际应用中取得了显著成效。例如,北京华盛恒辉和北京五木恒润卫星故障预警系统。这些成功案例为卫星故障预警系统的推广和应用提供了有力支持。   核心功能   实时状态监测:
    华盛恒辉l58ll334744 2025-04-09 19:49 55浏览
  •   物质扩散与污染物监测系统软件:多领域环境守护的智能中枢   北京华盛恒辉物质扩散与污染物监测系统软件,作为一款融合了物质扩散模拟、污染物监测、数据分析以及可视化等多元功能的综合性工具,致力于为环境科学、公共安全、工业生产等诸多领域给予强有力的技术支撑。接下来,将从功能特性、应用场景、技术实现途径、未来发展趋势等多个维度对这类软件展开详尽介绍。   应用案例   目前,已有多个物质扩散与污染物监测系统在实际应用中取得了显著成效。例如,北京华盛恒辉和北京五木恒润物质扩散与污染物监测系统。这
    华盛恒辉l58ll334744 2025-04-09 14:54 129浏览
  • 文/Leon编辑/侯煜‍就在小米SU7因高速交通事故、智驾性能受到质疑的时候,另一家中国领先的智驾解决方案供应商华为,低调地进行了一场重大人事变动。(详情见:雷军熬过黑夜,寄望小米SU7成为及时雨)4月4日上午,有网友发现余承东的职务发生了变化,华为官网、其个人微博认证信息为“常务董事,终端BG董事长”,不再包括“智能汽车解决方案BU董事长”。余承东的确不再兼任华为车BU董事长,但并非完全脱离华为的汽车业务,而是聚焦鸿蒙智行。据悉,华为方面寻求将车BU独立出去,但鸿蒙智行仍留在华为终端BG部门。
    华尔街科技眼 2025-04-09 15:28 115浏览
  • 政策驱动,AVAS成新能源车安全刚需随着全球碳中和目标的推进,新能源汽车产业迎来爆发式增长。据统计,2023年中国新能源汽车渗透率已突破35%,而欧盟法规明确要求2024年后新能效车型必须配备低速提示音系统(AVAS)。在此背景下,低速报警器作为车辆主动安全的核心组件,其技术性能直接关乎行人安全与法规合规性。基于WT2003H芯片开发的AVAS解决方案,以高可靠性、强定制化能力及智能场景适配特性,正成为行业技术升级的新标杆。WT2003H方案技术亮点解析全场景音效精准触发方案通过多传感器融合技术
    广州唯创电子 2025-04-10 08:53 56浏览
  •     前几天同事问我,电压到多少伏就不安全了?考虑到这位同事的非电专业背景,我做了最极端的答复——多少伏都不安全,非专业人员别摸带电的东西。    那么,是不是这么绝对呢?我查了一下标准,奇怪的知识增加了。    标准的名字值得玩味——《电流对人和家畜的效应》,GB/T 13870.5 (IEC 60749-5)。里面对人、牛、尸体分类讨论(搞硬件的牛马一时恍惚,不知道自己算哪种)。    触电是电流造成的生理效应
    电子知识打边炉 2025-04-09 22:35 36浏览
  • 行业痛点:电动车智能化催生语音交互刚需随着全球短途出行市场爆发式增长,中国电动自行车保有量已突破3.5亿辆。新国标实施推动行业向智能化、安全化转型,传统蜂鸣器报警方式因音效单一、缺乏场景适配性等问题,难以满足用户对智能交互体验的需求。WT2003HX系列语音芯片,以高性能处理器架构与灵活开发平台,为两轮电动车提供从基础报警到智能交互的全栈语音解决方案。WT2003HX芯片技术优势深度解读1. 高品质硬件性能,重塑语音交互标准搭载32位RISC处理器,主频高达120MHz,确保复杂算法流畅运行支持
    广州唯创电子 2025-04-10 09:12 66浏览
  • 贞光科技作为台湾Viking光颉电阻产品授权一级代理商,提供全系列高性能贴片电阻解决方案。本文详细介绍光颉AR/PR高精密薄膜电阻、CS/TCS电流感应电阻、LR合金电阻、CR/AR厚膜晶片电阻及PHV耐高压电阻的技术规格与应用场景,助力工程师精准选型。从高精度±0.01%到低温漂5ppm/℃,从微型0201到大功率应用,满足现代电子设计各类需求。全球电子产业快速发展,被动元件向小型化、高频化、高功率、耐压及抗湿方向演进。随着电子产品升级换代加速,应用领域多元化,与主流IC的兼容整合成为产品设计
    贞光科技 2025-04-09 16:50 44浏览
  •   物质扩散与污染物监测系统:环境守护的关键拼图   一、物质扩散原理剖析   物质扩散,本质上是物质在浓度梯度、温度梯度或者压力梯度等驱动力的作用下,从高浓度区域向低浓度区域迁移的过程。在环境科学范畴,物质扩散作为污染物在大气、水体以及土壤中迁移的关键机制,对污染物的分布态势、浓度动态变化以及环境风险程度有着直接且重大的影响。   应用案例   目前,已有多个物质扩散与污染物监测系统在实际应用中取得了显著成效。例如,北京华盛恒辉和北京五木恒润物质扩散与污染物监测系统。这些成功案例为物质
    华盛恒辉l58ll334744 2025-04-09 11:24 81浏览
我要评论
0
0
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦