资源描述:
《消除笔记本的高频电流噪音》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、消除笔记本的高频电流噪音季光dummyshining365@gmail.com.dum摘要:有些笔记本在使用中发出一种高频电流噪音。这种噪音随着硬盘的读写,用户对窗口界面中的滚动条的拉动发生变化,并在操作系统启动之后几乎始终存在,只有当用户播放音频文件时这种噪音会消失。本文利用这一特点针对Windows操作系统给出了消除噪音解决方案。本文设计了一个占用资源较少的Windows系统服务,在里面模拟音频文件的播放,从而将噪音消除。关键字:笔记本高频电流噪音 Windows系统服务 问题分析有些笔记本由于设计方面的问题,如果使用了USB设备或蓝牙模块,在运行中会发出一种高频电流噪音。例子
2、包括DellD610,ThinkR60e(在使用电池的模式下)。这种噪音的来源并未得到官方的解释。但是有些厂商已经发布了修复这种噪音问题的BIOS补丁[1]。但是某些厂商并未正面解决这个问题[2]。有一种比较方便易行的方法可以把这种噪音消除:播放一个音频文件,然后按下暂停按钮。某些用户反映在运行一些游戏时也可以将噪音消除,其实也是利用了游戏背景音乐的作用。但是这种方法的缺点是需要手工操作,并且音乐播放器往往占用大量的内存。我们应该考虑用一种节省的方式实现它。设计与实现Windows提供了一组波形音频的编程接口。我们可以利用它们模拟播放器的暂停状态://代码: 模拟播放器的暂停状态H
3、WAVEOUT hWaveOut; //波形音频输出句柄BYTE mute[MUTE_LENGTH]; //静音符号串WAVEFORMATEX waveformat = { WAVE_FORMAT_PCM, 1, SAMPLE_RATE, SAMPLE_RATE, 1, 8, 0}; //设定波形音频的格式WAVEHDR waveHdr = { 0, MUTE_LENGTH, 0, 0, 0, 1, NULL, 0}; //音频数据信息头Fill
4、Memory(mute, MUTE_LENGTH, (BYTE)0x80); //用静音符号填充waveHdr.lpData = mute; //初始化信息头指针//打开音频设备waveOutOpen (&hWaveOut, WAVE_MAPPER, &waveformat, 0, 0, CALLBACK_FUNCTION);//准备信息头waveOutPrepareHeader (hWaveOut, &waveHdr, sizeof (WAVEHDR)) ;//播放静音符号waveOutWrite (hWaveOut, &waveHdr
5、, sizeof (WAVEHDR)) ;//暂停waveOutPause(hWaveOut) ;利用这段代码写一个win32程序,保证程序进程不会退出(可利用一个含有Sleep调用的死循环或弹出一个模态对话框实现),即可实现消除噪音的作用。然而这样做仍然不够完善。我们希望系统在启动的时候,无论有用户登录与否,都能够自动地调用它。为了解决这一问题,我们应当把它改造为Windows的系统服务。Windows系统服务的编写需要服从一定的格式规范,请参阅相关文献[3],本文不予详述。需要注意的是,如果编写为独立的Windows服务,仍然需要1,900K左右的内存;如果编写为寄存在svch
6、ost中的服务[4],则可以把内存占用量大大降低,达到300~400K。本文采用了后者。完整代码如下(我们把服务名取作DenoiseSvc31):/*消电流噪声 svchost版 3.1*/#include #include #define SLEEP_TIME 10000#define SERVICE_NAME "DenoiseSvc31"//服务名#define MUTE_LENGTH 128#define SAMPLE_RATE 11025SERVICE_STATUS ServiceStatus;SERVICE_STA
7、TUS_HANDLE hStatus;void InitService(void) { HWAVEOUT hWaveOut ; BYTE mute[MUTE_LENGTH]; WAVEFORMATEX waveformat = { WAVE_FORMAT_PCM, 1, SAMPLE_RATE, SAMPLE_RATE, 1, 8, 0 }; WAVEHDR waveHdr = { 0, MUTE_LENG