感谢大家支持51Testing软件测试网!

消除笔记本的高频电流噪音

上一篇 / 下一篇  2008-11-18 22:10:47 / 个人分类:小娱乐

:F~U n0Ik0摘要:有些笔记本在使用中发出一种高频电流噪音。这种噪音随着硬盘的读写,用户对窗口界面中的滚动条的拉动发生变化,并在操作系统启动之后几乎始终存在,只有当用户播放音频文件时这种噪音会消失。本文利用这一特点针对Windows操作系统给出了消除噪音解决方案。本文设计了一个占用资源较少的Windows系统服务,在里面模拟音频文件的播放,从而将噪音消除。51Testing软件测试网z.W1k;?S eE

51Testing软件测试网N4KzY3W

关键字:笔记本高频电流噪音 Windows系统服务
"t ch7[4N o051Testing软件测试网VP|z`S~ A},x{

]^6R ^sa0问题分析

A``K.@)N[0

有些笔记本由于设计方面的问题,如果使用了USB设备或蓝牙模块,在运行中会发出一种高频电流噪音。例子包括Dell D610Think R60e(在使用电池的模式下)。这种噪音的来源并未得到官方的解释。但是有些厂商已经发布了修复这种噪音问题的BIOS补丁[1]。但是某些厂商并未正面解决这个问题[2]

|(S0k| C0

有一种比 较方便易行的方法可以把这种噪音消除:播放一个音频文件,然后按下暂停按钮。某些用户反映在运行一些游戏时也可以将噪音消除,其实也是利用了游戏背景音乐 的作用。但是这种方法的缺点是需要手工操作,并且音乐播放器往往占用大量的内存。我们应该考虑用一种节省的方式实现它。

"W(W/mCLF#in"W e~051Testing软件测试网0JL ~?!\/Mqq3l

设计与实现

S3U~?&D*`0oa0

Windows提供了一组波形音频的编程接口。我们可以利用它们模拟播放器的暂停状态:51Testing软件测试网HM!uB_!Ml6ZpC

51Testing软件测试网"^hl] Ruzi

//代码模拟播放器的暂停状态
(h+t)H;W7d CG;K0
HWAVEOUT hWaveOut;          //波形音频输出句柄
1?*N0XZ$vv3OY0
BYTE mute[MUTE_LENGTH];     //静音符号串
-J3x6h0} n$L)E-HW0
WAVEFORMATEX waveformat = {
w3S[3xS:Tec1I0    WAVE_FORMAT_PCM, 1, SAMPLE_RATE, SAMPLE_RATE, 180
H3Alp_k rM0};                          //
设定波形音频的格式51Testing软件测试网[ BMB4C_W|&sM
WAVEHDR waveHdr = {
O\y0b;OfK0    0, MUTE_LENGTH, 0001, NULL, 0
+I9`\\MFt~ gr2s0};                          //
音频数据信息头
{,v$BBQ_(t0

%YIJ;A*L0FillMemory(mute, MUTE_LENGTH, (BYTE)0x80);  //
用静音符号填充51Testing软件测试网-VRn K(SM9s Y*K:D3i
waveHdr.lpData = mute;                      //初始化信息头指针
0T ^f;O].e,C ^8^0//
打开音频设备51Testing软件测试网8{4Tf"o#y*d
waveOutOpen (&hWaveOut, WAVE_MAPPER, &waveformat, 00, CALLBACK_FUNCTION);
#K eo'Gh})w8u0//
准备信息头51Testing软件测试网g3\|'`HH0tj@
waveOutPrepareHeader (hWaveOut, &waveHdr, sizeof (WAVEHDR)) ;
p7@ H{0M0//
播放静音符号51Testing软件测试网3S_X4FdO9y A
waveOutWrite (hWaveOut, &waveHdr, sizeof (WAVEHDR)) ;51Testing软件测试网9mE"K6i$}_I
//
暂停
/o4P0PEl0
waveOutPause(hWaveOut) ;51Testing软件测试网!QV"~P T vR}Y

利用这段代码写一个win32程序,保证程序进程不会退出(可利用一个含有Sleep调用的死循环或弹出一个模态对话框实现),即可实现消除噪音的作用。

rF(|k |$i d? m `#}0

然而这样做仍然不够完善。我们希望系统在启动的时候,无论有用户登录与否,都能够自动地调用它。为了解决这一问题,我们应当把它改造为Windows的系统服务。

QF(vJ$F,Y2M+z0

Windows系统服务的编写需要服从一定的格式规范,请参阅相关文献[3],本文不予详述。需要注意的是,如果编写为独立的Windows服务,仍然需要1,900K左右的内存;如果编写为寄存在svchost中的服务[4],则可以把内存占用量大大降低,达到300~400K。本文采用了后者。

n:X6u-K*~ [0

完整代码如下(我们把服务名取作DenoiseSvc31)51Testing软件测试网m&b`*F N r

]g4hb,C/qG k0/*消电流噪声 svchost 3.1*/51Testing软件测试网Xg0A5Vy)ok9az
#include <windows.h>51Testing软件测试网DC0rF.D Yiy
#include <stdio.h>
;j+PWs+YkW0

%\*~:j:BB ^3U7j0#define SLEEP_TIME 10000
}WtS$@hGV Dz0#define SERVICE_NAME "DenoiseSvc31"
//
服务名51Testing软件测试网W(\%} @/J6]U;AB
#define MUTE_LENGTH 128
MRK9{:|0F~n8l@0#define SAMPLE_RATE 11025
Pi'}}lgG*Bgf0

y4zI CW2m7O e0E3JU0SERVICE_STATUS          ServiceStatus;
(pMmY%]Y0SERVICE_STATUS_HANDLE   hStatus;51Testing软件测试网 |R%o,lU9L [*YW3X7E

|nhRC0void InitService(void) {
OgIbx3vO8X0    HWAVEOUT hWaveOut ;
6l:A u`8c(tqFb a;NU0    BYTE mute[MUTE_LENGTH];
1a r[;D,`|6j0    WAVEFORMATEX waveformat = {
[T(ZZ_n0        WAVE_FORMAT_PCM, 1, SAMPLE_RATE, SAMPLE_RATE, 180
S'][5|8a?fV0    };
wg0I v _'h"Lae0    WAVEHDR waveHdr = {
}WS6M-g0} F P0        0, MUTE_LENGTH, 0001, NULL, 0
&ZW,MD6\v U0    };
(T0vWz#d%~,S0H051Testing软件测试网 dK@0\3h'M
    FillMemory(mute, MUTE_LENGTH, (BYTE)0x80);
v*v[#s$x \J0    waveHdr.lpData = mute;
J#OsRQic0    waveOutOpen (&hWaveOut, WAVE_MAPPER, &waveformat, 0,0,CALLBACK_FUNCTION);
(_0Z QU3G&@/|0    waveOutPrepareHeader (hWaveOut, &waveHdr, sizeof (WAVEHDR)) ;
+mS8^/W URFX,J0    waveOutWrite (hWaveOut, &waveHdr, sizeof (WAVEHDR)) ;51Testing软件测试网g+[&E)at4a4K
    waveOutPause(hWaveOut) ;
\"q/v"u ycZ0}51Testing软件测试网%N_k$N+Ds4E

Vd8Sbi f*cTd0void ControlHandler(DWORD request)51Testing软件测试网:LJ)`peg
{
D&nm#? S!`4t0    switch(request) {51Testing软件测试网:\4J:J*R$ji$~PC"c-t S
    case SERVICE_CONTROL_STOP:
KzYx)eR0    case SERVICE_CONTROL_SHUTDOWN:
S9v{-\y0        ServiceStatus.dwWin32ExitCode = 0;
9?T2g/H#?1m0        ServiceStatus.dwCurrentState = SERVICE_STOPPED;
o(a'U%LUXgB0        SetServiceStatus (hStatus, &ServiceStatus);
4\({C,koW0        return;
$~$B?}#j;RTs051Testing软件测试网0w \ udl.X P8Lh;o
    default:51Testing软件测试网(iM8M6ksC
        break;
/yOS{Y0    }
$M wCCp0
(Mnm H'FP7h%]E0    // Report current status
%LK"v A*S$d0
    SetServiceStatus (hStatus, &ServiceStatus);
iv;Z#I d"n p+j3PYj0
P m0as%J l0    return;51Testing软件测试网 c6] yn }'g2W8?
}
)P0X.U uR"B051Testing软件测试网(q'w*_J2@i qP
#pragma argsused
f/L*I+VY/O }1us0
__declspec(dllexport) VOID WINAPI ServiceMain(DWORD dwArgc, LPTSTR *lpszArgv)51Testing软件测试网,V4PEa;U_c1Qjc
{
4jNz&@]0    ServiceStatus.dwServiceType = SERVICE_WIN32_SHARE_PROCESS;51Testing软件测试网Q|AGvF:C
    ServiceStatus.dwCurrentState = SERVICE_START_PENDING;
1^I*r4s/[ddU0    ServiceStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP |51Testing软件测试网:Rn.j&dOj
        SERVICE_ACCEPT_SHUTDOWN;
8pw3h%xF0    ServiceStatus.dwWin32ExitCode = 0;
V$`hH5R0    ServiceStatus.dwServiceSpecificExitCode = 0;
'?_fn!_ Z&I6g0    ServiceStatus.dwCheckPoint = 0;
Rgt N&d[BO!}0    ServiceStatus.dwWaitHint = 0;51Testing软件测试网*@m"R~A

*_J$T\i'W\ \.Un0    hStatus = RegisterServiceCtrlHandler( SERVICE_NAME,
u6E7y6bE0W"Z*m0        (LPHANDLER_FUNCTION)ControlHandler);51Testing软件测试网,Q!t2w+LgE8ll+{ c
    if (hStatus == (SERVICE_STATUS_HANDLE)0) {
B"e*Q5a[8s2j0        // Registering Control Handler failed51Testing软件测试网#w"|&I^&F&n:S0bB
        return;
h2r6lTSE~#X0    }51Testing软件测试网.E3Y5CT _S&G P3]@)W
    // Initialize Service51Testing软件测试网.xhl F s$g,~
    InitService();
/M&j7s(i-rf0
A}h8b8u5P5J0    // We report the running status to SCM.
?$W U(bXS-ZYBgU0
    ServiceStatus.dwCurrentState = SERVICE_RUNNING;51Testing软件测试网 w0@k&o'Lf4]'b!E P
    SetServiceStatus (hStatus, &ServiceStatus);51Testing软件测试网gP#w3VAA `;h!K6[G

H$u9Ic0U4F9E0    // The worker loop of a service
RV4rZ(D[$K0
    while (ServiceStatus.dwCurrentState == SERVICE_RUNNING) {
l/] ``2K)V0        Sleep(SLEEP_TIME);
R#}JzyOl-K0    }51Testing软件测试网8|)S]^'}EU N z
    return;
&o y6@1D+B&Y0}
51Testing软件测试网0_7CO7F U

Svchost服务要求可执行文件必须为动态链接库。我们把它编译为denoise.dll并拷贝到%windir%\system32目录下。剩下的任务就是把它安装到系统上。

C|~9jbZ9[0

为系统添加一个服务需要修改注册表。对于Svchost服务,需要修改的地方包括:51Testing软件测试网.bK#v(X7GH&lt

`:d%u? tL7@0l        HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\SvcHost:把服务添加到某个Svchost组内。

9]%mxig"W@051Testing软件测试网3PN+?{]0o

l        HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services:添加服务的主键及相关键值。

a5mP;Cd"yX0

代码如下:51Testing软件测试网F;g;O@kG C0R`E Q

51Testing软件测试网~Y T b.uV"XGX

Windows Registry Editor Version 5.00

"X5\[&L-MmW0

.vzr2p%?0 

S~Zuyp-A;B0

,H2Y7`:C7yjR{ ]6`0[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\DenoiseSvc31]

8V5E,vf&{4`;h-C}051Testing软件测试网$`1IFk S I2C/Lo

"Type"=dword:0000002051Testing软件测试网mn"xbv8_2s^

51Testing软件测试网 ]uFH(m9jx

"Start"=dword:0000000251Testing软件测试网VFFA:MW

51Testing软件测试网%v#cPhkd8T

"ErrorControl"=dword:0000000151Testing软件测试网%K,J?$Nm+lw ]*C0Wt+C

51Testing软件测试网,u$i;p0Guq:u\

"ImagePath"=hex(2):25,00,53,00,79,00,73,00,74,00,65,00,6d,00,52,00,6f,00,6f,00,\51Testing软件测试网[!X H(k/LSl

C b0Z[ {0`M0 74,00,25,00,5c,00,73,00,79,00,73,00,74,00,65,00,6d,00,33,00,32,00,5c,00,73,\51Testing软件测试网3s0vaPwK2Z~

z!vU,h zs:L xn0 00,76,00,63,00,68,00,6f,00,73,00,74,00,2e,00,65,00,78,00,65,00,20,00,2d,00,\

)UKtN.Gu0

N"n*?H9vZ.~kH0 6b,00,20,00,48,00,54,00,54,00,50,00,46,00,69,00,6c,00,74,00,65,00,72,00,00,\

@?%@a'_ j"A051Testing软件测试网 g+s(o2F'b%F

 00

7]7jZ&G8_B0

E&]8sW p&q J+[%~0"DisplayName"="DenoiseSvc31"

Z-{UGv}b%K051Testing软件测试网b2?+MLk5O$S4D$j#Z9L

"DependOnService"=hex(7):4c,00,61,00,6e,00,6d,00,61,00,6e,00,57,00,6f,00,72,00,\51Testing软件测试网a*z5^ybG:d

\}uZnQj%\8EE9O0 6b,00,73,00,74,00,61,00,74,00,69,00,6f,00,6e,00,00,00,00,00

[!BXh7Z/i8d({051Testing软件测试网r d'f Nc0g

"DependOnGroup"=hex(7):00,0051Testing软件测试网'O RHw/J1r*P*n

51Testing软件测试网(XD-{2A5N,f mc}9Su

"ObjectName"="NT AUTHORITY\\LocalService"51Testing软件测试网$]xhJhF_

@3mM4BJ?4k;gK3` J0"Descrīption"="消除笔记本的高频电流噪音"51Testing软件测试网!v1h V%qF T

*S-m)C:Xy9W:~3n0 51Testing软件测试网Z1@#i$H/t@+g#b'g

51Testing软件测试网5L H/Lde7X

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\DenoiseSvc31\Enum]51Testing软件测试网(I+K?;VNz&na4M6A

51Testing软件测试网Re;h`.~{

"0"="Root\\LEGACY_ALERTER\\0000"

*w}_+cx0oR+j;h0w0

r5L,}L2K+si0"Count"=dword:00000001

vyl_%[D0

q1kwEd0"NextInstance"=dword:0000000151Testing软件测试网 A0{#l Z%@B;z@

51Testing软件测试网Qe-u[S9o \5M\

 51Testing软件测试网/x+RmJ3Qa"sL-J

51Testing软件测试网\*Hv.T?CWk

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\DenoiseSvc31\Parameters]

J i+E9C8a1k+O:px3a0

#Oq5M#fwY P,sc0"AlertNames"=hex(7):00,00

8Vj0jYn-NDJ051Testing软件测试网1HNu d4s;Za:X w

"ServiceDll"=hex(2):25,00,53,00,79,00,73,00,74,00,65,00,6d,00,52,00,6f,00,6f,\51Testing软件测试网Rh)q3@ UX

@/t0[+I4R&mO0 00,74,00,25,00,5c,00,53,00,79,00,73,00,74,00,65,00,6d,00,33,00,32,00,5c,00,\51Testing软件测试网-i$_|$e0z

51Testing软件测试网wW&_`t8T,D}-{

 64,00,65,00,6e,00,6f,00,69,00,73,00,65,00,2e,00,64,00,6c,00,6c,00,00,0051Testing软件测试网x KnW&K0YU)N#K

ETP r1`%P#K i0 51Testing软件测试网,l0b ^a+z

KktD$]/}0za1w I o0[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\DenoiseSvc31\Security]51Testing软件测试网}4@(Lz3d1d

51Testing软件测试网2t D5jLk;iJ

"Security"=hex:01,00,14,80,90,00,00,00,9c,00,00,00,14,00,00,00,30,00,00,00,02,\51Testing软件测试网3P7@} t%nl];th

Q%|6LRp)Dv0 00,1c,00,01,00,00,00,02,80,14,00,ff,01,0f,00,01,01,00,00,00,00,00,01,00,00,\51Testing软件测试网],C"a'|g Y#s*Z

6?Bi{#E.Q(@4J0 00,00,02,00,60,00,04,00,00,00,00,00,14,00,fd,01,02,00,01,01,00,00,00,00,00,\

Dj qm-h](rZrh*P051Testing软件测试网M-B R ]2s%nI

 05,12,00,00,00,00,00,18,00,ff,01,0f,00,01,02,00,00,00,00,00,05,20,00,00,00,\51Testing软件测试网nO^_+n2dd

#Vto3f.XOQ_Zb:Z4W0 20,02,00,00,00,00,14,00,8d,01,02,00,01,01,00,00,00,00,00,05,0b,00,00,00,00,\51Testing软件测试网.a-AcQ FW7Y;r.q

51Testing软件测试网(PR1v!CN}Z

 00,18,00,fd,01,02,00,01,02,00,00,00,00,00,05,20,00,00,00,23,02,00,00,01,01,\

&iV@ euf051Testing软件测试网 Y-FpZ sp(yB.`

 00,00,00,00,00,05,12,00,00,00,01,01,00,00,00,00,00,05,12,00,00,00

@ R%qt jA{0

{G qc!x!U1g#Gy0 51Testing软件测试网zqy.s3E R M

51Testing软件测试网rH+~,pG/d9O+E o\${W

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\SvcHost]51Testing软件测试网8pp:G usD y8B-[E4\

51Testing软件测试网y"N3}h-b&\8e"Vn:d F

"HTTPFilter"=hex(7):48,00,54,00,54,00,50,00,46,00,69,00,6c,00,74,00,65,00,72,\51Testing软件测试网n!F J;[ g[;x}

51Testing软件测试网N,ym K!B

 00,00,00,44,00,65,00,6e,00,6f,00,69,00,73,00,65,00,53,00,76,00,63,00,33,00,\

*P2j&@c&RI%\051Testing软件测试网:f_ r9e\ vB N6C.?

 31,00,00,00,00,00

gBf/F;K4Ta,C0

把它保存在denoise.reg中双击运行,然后重启机器,噪音问题就解决了。51Testing软件测试网c!z{@6kpK/^9T&YIu

51Testing软件测试网5TEMrqK0R%bO)L

性能与不足

w5O3FK!KF*z `I0

经过测试,该服务占用的内存约为370K,基本不占用CPU,对系统的负担是很小的。它消除噪音彻底,无论是否使用电池,以及系统是否从休眠中恢复,都不会再度产生噪音。51Testing软件测试网YBX7t vw

在运行该服务之后,少数情况下操作系统的事件配音的质量会受到影响,比如关机音乐会发生轻微爆音。但是对音乐播放器未造成能观察到的影响。

4?&Xr&vZ7I Cr0

参考文献

xs,\_;V+n7ZH051Testing软件测试网'U VW N7uj4t6R*I)N

[1]IBM ThinkPad R52, T43 BIOS update.

.S6{1~.V` W`'aGR0

/A3i mj)s(C(U7Ot;|/K7|t0[2]Dell技术支持网站给出的消除噪音解决方案51Testing软件测试网 _ ^yI:Hm] i{t

51Testing软件测试网*Jf[V#er Wo.w

[3]Five Steps to Writing Windows Services in C

e(J["mBB,r/C0

4I:v I1]$Tu+L ~0[4]创建SvcHost.exe调用的服务原理与实践

&M0?EIW]"^5}0

uWu_:U-q051Testing软件测试网-A2n BbK/x F!LT
51Testing软件测试网 V#l;I/o1C

点击此处下载可执行文件

+\E3D-kf3\7{ UV0

TAG:

 

评分:0

我来说两句

日历

« 2024-05-01  
   1234
567891011
12131415161718
19202122232425
262728293031 

数据统计

  • 访问量: 48517
  • 日志数: 69
  • 图片数: 4
  • 文件数: 2
  • 书签数: 1
  • 建立时间: 2006-12-27
  • 更新时间: 2010-02-25

RSS订阅

Open Toolbar