📄 ut.cs
字号:
using System;
using System.Text;
using System.Diagnostics;
using System.Windows.Forms;
using System.Runtime.InteropServices;
namespace gowk.multimedia
{
/// <summary>
/// UT 的摘要说明。
/// </summary>
public class UT
{
public UT()
{
//
// TODO: 在此处添加构造函数逻辑
//
}
/////////////////////////////////////////////////////////////////////////
// LowPassWave
//
// 低通滤波
//
// 参数:Format —— 波形音频格式结构WAVEFORMATEX
// lpData —— 波形音频数据块指针
// dwDataLength —— 波形音频数据块大小
// fFrequencyPass —— 滤波频率阈值
//
// 无返回值
/////////////////////////////////////////////////////////////////////////
unsafe public static void LowPassWave(WAVEFORMATEX Format, byte[] data,
int dwDataLength, float fFrequencyPass)
{
fixed(byte* lpData=data)
{
float fParam0,fParam1,fParam2;
int nSamplesPerSec = Format.nSamplesPerSec;
fParam0=(1.0f/nSamplesPerSec)/(2.0f/fFrequencyPass+
1.0f/nSamplesPerSec);
fParam1=fParam0;
fParam2=(1.0f/nSamplesPerSec-2.0f/fFrequencyPass)/
(2.0f/fFrequencyPass+1.0f/nSamplesPerSec);
PassWave(Format, lpData, dwDataLength, fFrequencyPass,
fParam0, fParam1, fParam2);
}
}
/////////////////////////////////////////////////////////////////////////
// HighPassWave
//
// 高通滤波
//
// 参数:Format —— 波形音频格式结构WAVEFORMATEX
// lpData —— 波形音频数据块指针
// dwDataLength —— 波形音频数据块大小
// fFrequencyPass —— 滤波频率阈值
//
// 无返回值
/////////////////////////////////////////////////////////////////////////
unsafe public static void HighPassWave(WAVEFORMATEX Format,byte[] data,
int dwDataLength, float fFrequencyPass)
{
fixed(byte* lpData=data)
{
float fParam0,fParam1,fParam2;
int nSamplesPerSec = Format.nSamplesPerSec;
fParam0=(20.0f/fFrequencyPass+1.0f/nSamplesPerSec)/
(2.0f/fFrequencyPass+1.0f/nSamplesPerSec);
fParam1=(-20.0f/fFrequencyPass+1.0f/nSamplesPerSec)/
(2.0f/fFrequencyPass+1.0f/nSamplesPerSec);
fParam2=(1.0f/nSamplesPerSec-2.0f/fFrequencyPass)/
(2.0f/fFrequencyPass+1.0f/nSamplesPerSec);
PassWave(Format, lpData, dwDataLength, fFrequencyPass,
fParam0, fParam1, fParam2);
}
}
/////////////////////////////////////////////////////////////////////////
// PassWave
//
// 滤波算法
//
// 参数:Format —— 波形音频格式结构WAVEFORMATEX
// lpData —— 波形音频数据块指针
// dwDataLength —— 波形音频数据块大小
// fFrequencyPass —— 滤波频率阈值
// fParam0, fParam1, fParam2 —— 滤波参数
//
// 无返回值
/////////////////////////////////////////////////////////////////////////
unsafe private static void PassWave(WAVEFORMATEX Format, byte* lpData,
int dwDataLength, float fFrequencyPass,
float fParam0,float fParam1, float fParam2)
{
float fXL0,fXL1,fYL1,fYL0;
float fXR0,fXR1,fYR1,fYR0;
int i;
switch(Format.wBitsPerSample)
{
case 8:
switch(Format.nChannels)
{
case 1:
fXL0=(float)*(byte *)lpData;
fXL1=fXL0;
fYL1=fXL0;
for(i=0;i<dwDataLength;i+=sizeof(byte))
{
fXL0=(float)*(byte *)(lpData+i);
fYL0=fParam0*fXL0+fParam1*fXL1-
fParam2*fYL1;
*(byte *)(lpData+i)=(byte)fYL0;
fXL1=fXL0;
fYL1=fYL0;
}
break;
case 2:
fXL0=(float)*(byte *)lpData;
fXL1=fXL0;
fYL1=fXL0;
fXR0=(float)*(byte *)(lpData+sizeof(byte));
fXR1=fXR0;
fYR1=fXR0;
for(i=0;i<dwDataLength;i+=2*sizeof(byte))
{
fXL0=(float)*(byte *)(lpData+i);
fYL0=fParam0*fXL0+fParam1*fXL1-
fParam2*fYL1;
*(byte *)(lpData+i)=(byte)fYL0;
fXL1=fXL0;
fYL1=fYL0;
fXR0=(float)*(byte *)(lpData+i+sizeof(byte));
fYR0=fParam0*fXR0+fParam1*fXR1-
fParam2*fYR1;
*(byte *)(lpData+i+sizeof(byte))=(byte)fYR0;
fXR1=fXR0;
fYR1=fYR0;
}
break;
}
break;
case 16:
switch(Format.nChannels)
{
case 1:
fXL0=(float)*(short *)lpData;
fXL1=fXL0;
fYL1=fXL0;
for(i=0;i<dwDataLength;i+=2)
{
fXL0=(float)*(short *)(lpData+i);
fYL0=fParam0*fXL0+fParam1*fXL1-
fParam2*fYL1;
*(short *)(lpData+i)=(short)fYL0;
fXL1=fXL0;
fYL1=fYL0;
}
break;
case 2:
fXL0=(float)*(short *)lpData;
fXL1=fXL0;
fYL1=fXL0;
fXR0=(float)*(short *)(lpData+sizeof(short));
fXR1=fXR0;
fYR1=fXR0;
for(i=0;i<dwDataLength;i+=2*sizeof(short))
{
fXL0=(float)*(short *)(lpData+i);
fYL0=fParam0*fXL0+fParam1*fXL1-
fParam2*fYL1;
*(short *)(lpData+i)=(short)fYL0;
fXL1=fXL0;
fYL1=fYL0;
fXR0=(float)*(short *)(lpData+
i+sizeof(short));
fYR0=fParam0*fXR0+fParam1*fXR1-
fParam2*fYR1;
*(short *)(lpData+i+sizeof(short))=
(short)fYR0;
fXR1=fXR0;
fYR1=fYR0;
}
break;
}
break;
}
}
#region
/*********************************************************************
*
* ChangeDIBSize()
*
* 参数:
*
* HDIB hDIB —— 将缩放的DIB的句柄
* int nWidth,int nHeight —— 新DIB的宽度和高度
*
* 返回值:
*
* HDI —— 新DIB 的句柄
*
* 说明:
*
* 本函数对DIB进行缩放,并生成一个新的DIB, 源DIB保持不变。
*
*********************************************************************/
/*
HDIB ChangeDIBSize(HDIB hDIB,int nWidth,int nHeight)
{
LPBITMAPINFO lpbmi = NULL;
LPBYTE lpSourceBits,lpTargetBits,lpResult;
HDC hDC = NULL,hSourceDC,hTargetDC;
HBITMAP hSourceBitmap,hTargetBitmap,hOldTargetBitmap,
hOldSourceBitmap;
DWORD dwSourceBitsSize,dwTargetBitsSize,dwTargetHeaderSize;
HDIB hNewDIB;
DWORD dwSize;
//WaitCursorBegin();
// Get DIB pointer
if (!hDIB)
{
//WaitCursorEnd();
return NULL;
}
LPBITMAPINFO lpSrcDIB = (LPBITMAPINFO)GlobalLock(hDIB);
if (!lpSrcDIB)
{
//WaitCursorEnd();
return NULL;
}
// Allocate and fill out a BITMAPINFO struct for the new DIB
dwTargetHeaderSize = sizeof( BITMAPINFOHEADER ) +
PaletteSize(lpSrcDIB);
lpbmi = (LPBITMAPINFO)malloc( dwTargetHeaderSize );
memcpy(lpbmi,lpSrcDIB,dwTargetHeaderSize);
lpbmi->bmiHeader.biWidth = nWidth;
lpbmi->bmiHeader.biHeight = nHeight;
// Gonna use DIBSections and BitBlt() to do the conversion,so make 'em
hDC = GetDC( NULL );
hTargetBitmap = CreateDIBSection( hDC,lpbmi,
DIB_RGB_COLORS,(VOID **)&lpTargetBits,NULL,0 );
hSourceBitmap = CreateDIBSection( hDC,lpSrcDIB,
DIB_RGB_COLORS,(VOID **)&lpSourceBits,NULL,0 );
hSourceDC = CreateCompatibleDC( hDC );
hTargetDC = CreateCompatibleDC( hDC );
// Flip the bits on the source DIBSection to match the source DIB
dwSourceBitsSize = lpSrcDIB->bmiHeader.biHeight *
BytesPerLine((LPBYTE)&(lpSrcDIB->bmiHeader));
dwTargetBitsSize = lpbmi->bmiHeader.biHeight *
BytesPerLine((LPBYTE)&(lpbmi->bmiHeader));
memcpy( lpSourceBits,FindDIBBits((LPBYTE)lpSrcDIB),dwSourceBitsSize );
lpbmi->bmiHeader.biSizeImage = dwTargetBitsSize;
// Select DIBSections into DCs
hOldSourceBitmap = (HBITMAP)SelectObject( hSourceDC,hSourceBitmap );
hOldTargetBitmap = (HBITMAP)SelectObject( hTargetDC,hTargetBitmap );
// put old bitmap in new bitmap
SetStretchBltMode( hTargetDC,COLORONCOLOR );
StretchBlt( hTargetDC,0,0,
lpbmi->bmiHeader.biWidth,lpbmi->bmiHeader.biHeight,
hSourceDC,0,0,
lpSrcDIB->bmiHeader.biWidth,lpSrcDIB->bmiHeader.biHeight,
SRCCOPY );
// Clean up and delete the DCs
SelectObject( hSourceDC,hOldSourceBitmap );
SelectObject( hTargetDC,hOldTargetBitmap );
DeleteDC( hSourceDC );
DeleteDC( hTargetDC );
ReleaseDC( NULL,hDC );
// Flush the GDI batch,so we can play with the bits
GdiFlush();
// Allocate enough memory for the new CF_DIB,and copy bits
dwSize = dwTargetHeaderSize + dwTargetBitsSize;
hNewDIB = GlobalAlloc(GHND,dwSize);
lpResult = (LPBYTE)GlobalLock(hNewDIB);
memcpy( lpResult,lpbmi,dwTargetHeaderSize );
memcpy( FindDIBBits( (LPBYTE)lpResult ),lpTargetBits,dwTargetBitsSize );
// final cleanup
DeleteObject( hTargetBitmap );
DeleteObject( hSourceBitmap );
free( lpbmi );
GlobalUnlock(hDIB);
GlobalUnlock(hNewDIB);
WaitCursorEnd();
return hNewDIB;
}
*/
#endregion
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -