如何制作出象winamp的小窗口里的波形

daidai 2000-07-06 01:59:00
我已经用傅立叶变换得到了歌曲的频谱,但是看上去效果和winamp的显示差了不少,
不知道winamp是怎么做的.我想可能是它把频谱中的一段拿出来显示,我对音乐一窍
不通,那位大侠指点一下吧.到底该选那一段呢,人的听觉对那段频谱最敏感,才能看出
动态效果
...全文
364 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
baobing 2000-09-06
  • 打赏
  • 举报
回复
请问怎样对pcm流进行fft变换?谢谢。
newyearday 2000-07-26
  • 打赏
  • 举报
回复
daidai,你的铺立叶算法是怎么实现的?能给我发一份吗?pcm是什么?怎么样把mp3解码到pcm数据流呢?
xdpan 2000-07-14
  • 打赏
  • 举报
回复
很抱歉,我没有现成的例子。但问题应该不难解决:
(1)请检查你的PCM流,可能没有将双声道分开;
(2)FFT变换后应取其一半,再截取;
(3)FFT算法实现的正确吗?
如果解决了上面的问题,结果是不应该出现问题的。
daidai 2000-07-14
  • 打赏
  • 举报
回复
xdpan:
我试了试,比以前好了点,但就是没有 winamp的感觉,哎,你有没有例子给我看看
xdpan 2000-07-14
  • 打赏
  • 举报
回复
yuandt,那是圆频率,对应的是分析频率,而分析频率是采样频率的一半。
至于MPEG Layer III的解码算法,你可以找一本MPEG标准的书看一看。
DAIDAI的问题去咨询FYAN吧。
daidai 2000-07-14
  • 打赏
  • 举报
回复
现在我的FFT没问题,双声道也分开了,分别做FFT然后加起来,请问为什么要取一半再
截取,是因为结果是对称的吗?
这些我都做了但是还是不行.
我这个播放器是非同步的,44.1KHZ每次buffer里添4608个值,两个
声道依次放在 buffer中,我的定时器定在65ms
yuandt 2000-07-14
  • 打赏
  • 举报
回复
xdpan:
对做FFT,那个最高值PI(3.14)我就看成是抽样频率你看
是不是这样的?
yuandt 2000-07-14
  • 打赏
  • 举报
回复
FFT的算法应该没有什么问题
我这有一个简单的,daidai你参考一下:

//small fft program,using complex.
#include "complex"
#include <iostream>
#include <conio.h>
using namespace std; //very important
#define PI 3.1415926
typedef complex<double> complexd; //use template
void myfft(double y[][2], int N) //N is the power of 2 (as 8,64, 1024)
{
complexd t1,t2,t;
int u,mu,i,j,k,n,l,s;
complexd *w = new complexd[N/2];
complexd *x = new complexd[N];
mu=0; u=N-1;
while (u>0) {mu++; u/=2;};
for (i=0; i<N; i++) x[i]=complexd(y[i][0],y[i][1]);
for (i=0; i<N; i++) { //sort input number array
k=i; l=0;
for (j=2; j<=N; j=j*2) {
l+=(N/j)*(k%2); k=k/2;
}
if (l>i) {
t=x[i];
x[i]=x[l];
x[l]=t;
}
}
for (i=0; i<N/2; i++) w[i]=complexd(cos(2*PI/N*i),sin(2*PI/N*i));
s=1;
for (i=0; i<mu; i++) { //fft by binary dividing
for (j=0; j<N; j+=s*2) {
for (k=0; k<s; k++) {
t=x[j+k+s]*(w[k*N/s/2]);
t1=x[j+k]+t;
t2=x[j+k]-t;
x[j+k]=t1;
x[j+k+s]=t2;
}
}
t1=x[j+k]+t;
t2=x[j+k]-t;
x[j+k]=t1;
x[j+k+s]=t2;
}
s*=2;
}
for (i=0; i<N; i++) {y[i][0]=x[i].real(); y[i][1]=x[i].imag();}
delete w; //very important. If not, the system will lost memory
delete x;
}
void main()
{
int i;
double u[8][2];
for (i=0; i<8; i++) u[i][0]=i+1; //the input
myfft(u,8);
for (i=0; i<8; i++) cout<<'('<<u[i][0]<<','<<u[i][1]<<')'<<endl;
_getch();
}
yuandt 2000-07-14
  • 打赏
  • 举报
回复
daidai & xdpan:
人耳对4k-8k的这一部分比较敏感,一般的歌曲也是这一部分频谱变化比较大
但是我觉得没有必要就把高频部分给滤掉。
反正是做FFT,高频部分也有值,daidai你想做明显一点,建议你:就按winamp
的上小框框里的频率点取值。
yuandt 2000-07-14
  • 打赏
  • 举报
回复
xdpan:
*.mp3->PCM->FFT这个过程倒是可行。
只不过我没有作过*.mp3->PCM的解码过程。
对MPEG Layer III的解码算法,xdpan能不能介绍一本书?
xdpan 2000-07-13
  • 打赏
  • 举报
回复
daidai,我说的是0~5000或0~8000Hz,并非5000~8000Hz。人耳对3000~5000Hz最敏感,低频部分不能去,只有高频部分因比重较小,视觉效果不明显,可省去。
daidai 2000-07-13
  • 打赏
  • 举报
回复
to yuandt:
问题是哪个才是我想表现的频谱呢,那些频谱看上去和winamp的效果相差
很大,它又做了什么变换才得到的呢。
如果直接把5000到8000HZ的画出来的话,就是没有那种和音乐跳动的感觉
xdpan 2000-07-13
  • 打赏
  • 举报
回复
yuandt,其实对*.mp3文件做离散傅立叶变换很简单,只要你先对*.mp3文件解码成PCM数据流,再做FFT即可,MATLAB做验证可以,使用化还的用C。
yuandt 2000-07-13
  • 打赏
  • 举报
回复
winamp的波形有两种,一种是时域的波形的抽样值,一种是频谱的响应值。
对第一种:直接对文件取样。我用matlab可以实现。不知道你怎么作的。
对第二种:如果已经得到了频谱,做成winamp那种,只要在想表现的频谱
取个值就完了。不过我想知道的是:你怎么对*.mp3文件做离散傅立叶变换的?
这个不太好做。
xdpan 2000-07-13
  • 打赏
  • 举报
回复
其实你只要把提取频谱的前5000~8000Hz显示就可以了。
daidai 2000-07-07
  • 打赏
  • 举报
回复
ft,你随便找本信号处理的书看看把
myc 2000-07-06
  • 打赏
  • 举报
回复
什么是“傅立叶变换“?什么是“歌曲的频谱”?能来信告诉我吗?my.c@netease.com
1。主窗口。 主窗口的功能有:动态显示音频波表,左右声道调整,暂停,继续,循环,下一首,上一首等。 2。歌曲目录。 我的这个程序是完全模拟Winamp写成的。不论是主窗口还使三个窗口的组合,在歌曲目录窗口中支持双击某首歌曲的播放,支持多个文件的同时打开,支持从资源管理器中拖放文件,支持歌曲目录的二次打开和保存,通过主窗口您能有选择的播放单个文件,按顺序播放和随机播放目录表中的文件。 3。作者信息。 此窗口的作用是凑够三个Winamp的完整布局,并无实际意义。 程序的开发环境是Delphi6.0操作系统是Win98se,用到的技术点有:(1)Api,在程序登录时的透明窗口和左右声道的控都使WindowsAPI的调用。(2)Delphi的Mediaplay控件的调用,在播放VCD文件时用的就是它。(3)VC++,大家最关心的肯定是动态波形表的问题,其实我为了这个问题已经查阅了一年的资料了,大家有时侯喜欢在工作闲暇时写写小工具软件,但是有些时候我们的知识面是不够的。要想达到Winamp的层次必定还相差很多,当然网友中可能有高手,好了我将解决大家的问题了。 刚开始时我认为波形表时调用某个Api函数来得到的,于是我查阅了所有的api手册,结果一无所获。后来我就开始了解码层次的研究,在网上这方面的资料太少我转了几个星期也一无所获。有一天我在下班的路上卖了一张VC++资料光盘,在其中居然有动态波形表的文章,通过它我知道了波形表的产生是解码的结果,它通过直接用一个8000个成员变量的庞大数组对特定的音乐文件进行手工解码最后通过声卡直接输出,其复杂程度是我所难以一是理解的代码量超过3万行。并且您还有乐理知识。其中的三维音乐效果模拟也是通过解码来完成的。我的日常工作是数据库程序设计,对多媒体开远不能达到文章中提到的层次,并且每一种格式的文件都要有不同的解码标准。这些标准是国际MP3组织定的详细内容还要阅读他们的技术文档。我的多媒体程序就这样有放下了。我的目标转到了第三方控件,我想通过第三方的控件来达到解码播放的目的。但是还是没有现成的控件,我前些日子无意中发现了上海一家多媒体解码公司提供了一个波形表动态联接库。通过它我实现了多媒体文件的波形表显示,但是它的预留的接口并不多导致我的程序不能首快进,快退的功能,要想的到完成功能只有花钱了。他们的这个动态联接库也只支持MP3解码并不支持MPG解码。
各位网友你们好:   首先感谢你们对我的“音乐天地”的支持,今天我的这个作品你们在使用是还可能有无足之出。为了让大家多能很好的使用它,为了它能够跟快的成长我从这个版本起就将程序的原代码开放了,希望各位高手能更好的完善它。在这我将介绍一下我的程序的各个部分。   1。主窗口。   主窗口的功能有:动态显示音频波表,左右声道调整,暂停,继续,循环,下一首,上一首等。   2。歌曲目录。   我的这个程序是完全模拟Winamp写成的。不论是主窗口还使三个窗口的组合,在歌曲目录窗口中支持双击某首歌曲的播放,支持多个文件的同时打开,支持从资源管理器中拖放文件,支持歌曲目录的二次打开和保存,通过主窗口您能有选择的播放单个文件,按顺序播放和随机播放目录表中的文件。   3。作者信息。   此窗口的作用是凑够三个Winamp的完整布局,并无实际意义。   程序的开发环境是Delphi6.0操作系统是Win98se,用到的技术点有:(1)Api,在程序登录时的透明窗口和左右声道的控都使WindowsAPI的调用。(2)Delphi的Mediaplay控件的调用,在播放VCD文件时用的就是它。(3)VC++,大家最关心的肯定是动态波形表的问题,其实我为了这个问题已经查阅了一年的资料了,大家有时侯喜欢在工作闲暇时写写小工具软件,但是有些时候我们的知识面是不够的。要想达到Winamp的层次必定还相差很多,当然网友中可能有高手,好了我将解决大家的问题了。   刚开始时我认为波形表时调用某个Api函数来得到的,于是我查阅了所有的api手册,结果一无所获。后来我就开始了解码层次的研究,在网上这方面的资料太少我转了几个星期也一无所获。有一天我在下班的路上卖了一张VC++资料光盘,在其中居然有动态波形表的文章,通过它我知道了波形表的产生是解码的结果,它通过直接用一个8000个成员变量的庞大数组对特定的音乐文件进行手工解码最后通过声卡直接输出,其复杂程度是我所难以一是理解的代码量超过3万行。并且您还有乐理知识。其中的三维音乐效果模拟也是通过解码来完成的。我的日常工作是数据库程序设计,对多媒体开远不能达到文章中提到的层次,并且每一种格式的文件都要有不同的解码标准。这些标准是国际MP3组织定的详细内容还要阅读他们的技术文档。我的多媒体程序就这样有放下了。我的目标转到了第三方控件,我想通过第三方的控件来达到解码播放的目的。但是还是没有现成的控件,我前些日子无意中发现了上海一家多媒体解码公司提供了一个波形表动态联接库。通过它我实现了多媒体文件的波形表显示,但是它的预留的接口并不多导致我的程序不能首快进,快退的功能,要想的到完成功能只有花钱了。他们的这个动态联接库也只支持MP3解码并不支持MPG解码。   如果您有这个毅力学到上海这家解码公司的技术,您将改变您现有的工作岗位。我也在不断的学习但愿网友中有人能尽快彻底解决这一问题。
非常好用 非常专业 授权(注册)方法: [授权流程窗口]→[离线授权]→[复申请码]→ (/[在注册器中输入申请码计算出应答码+复]/)→[粘贴应答码]→[完成授权] KMPlayer(2.9.3.1428)中开启方法: 将[plugins]文件夹覆盖KMP\[plugins]目录运行 "初始化插件.bat" [F2]-->[插件]-->[音频DSP插件]-->勾选中 dsp_vst.dll 即可 PotPlayer(1.4.19374)中开启方法: 将[plugins]文件夹放置于PotPlayer目录运行 "初始化插件.bat" [F5]-->[音频]-->[Winamp DSP插件设置]-->[设置本地[plugins]路径] 勾选中 dsp_vst.dll 即可 Foobar2000(0.9.6.3)中开启方法: 将[plugins]文件夹中所有文件(含子目录)放置于[components]文件夹中 运行 "初始化插件.bat" [Ctrl+P]-->[播放]-->[DSP 管理]-->[添加 VST 桥接]-->[配置]-->[浏览] -->[指定插件路径例:C:\Foobar2000\components\VST_plugins\iZotope Ozone 4.dll]即可 (最小化问题:关闭VST机架窗口可连续按两次 V 键呼出) Winamp(5.55.2405)中开启方法: 将[plugins]文件夹覆盖Winamp\[plugins]目录运行 "初始化插件.bat" [Ctrl+P]-->[插件]-->[DSP音效]-->勾选中 dsp_vst.dll 即可 千千静听(5.3)中开启方法: 将[plugins]文件夹覆盖TTPlayer\[plugins]目录运行 "初始化插件.bat" [F1]-->[音效插件]-->勾选中 dsp_vst.dll 即可 酷狗(5.329)中开启方法: 将[plugins]文件夹放置于KuGou2008目录运行 "初始化插件.bat" [F1]-->[音效插件]-->[指定插件目录例:C:\F:\KuGou2008\plugins]--> [勾选中 dsp_vst.dll]-->[插件模块]-->[VST 桥接工具]-->[配置插件]即可 请注意:以上方法可能因播放器版本不同导致文字描述内容有所出入. -------------------------------------------------------------------------- 特定界面支持右键菜单操作 快捷键 操作 Ctrl+B 全局旁路 双击或按Alt单击 滑块复位 Tab或Shift+Tab 切换焦点 小键盘Enter 确认 [F3] 选项 Ctrl+Shift+1~5 选择选项子窗口 Ctrl+1~6 选择模块子窗口 Alt+0~9 透明度等级 [F4] 流程图 [F5] 操作历史 [F6] 模块复位 Ctrl+P 预置管理器 Alt+方向键 幅度调节 Ctrl+方向键 微调 按住Alt点击 激活/旁路/切换模块 多选操作 Ctrl+Z 撤销前次操作 Ctrl+Y 恢复被撤销的操作 Esc 取消对话框 图示均衡器界面快捷键: 方向键 幅度微量调节 Shift+方向键 大幅度调节 Ctrl+方向键 Q值/斜率调整 Alt + ↑ ↓ 切换波形 Alt + → ← 切换频点 按住Alt点击均衡器界面 单显Q值 ---------------------------------------------

8,303

社区成员

发帖
与我相关
我的任务
社区描述
游戏开发相关内容讨论专区
社区管理员
  • 游戏开发
  • 呆呆敲代码的小Y
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧