【Project】情绪评定

来源:互联网 发布:Mac电脑打魔兽世界卡吗 编辑:程序博客网 时间:2024/04/30 20:26

前两天帮心理系的写的一个小程序,灰常灰常简单。

大致内容是通过一些情绪学习之后,评定之后声音的情绪反应。软件的需求也比较简单:

  1. 给定三种类型的masker音频,乱序之后播放给被试;
  2. 被试听到声音之后,根据情绪感受,对情绪效价和情绪唤起打分;
  3. 打分之后自动播放下一个声音;
  4. 最后统计三种类型的平均分;
大致效果如下:

界面用QT写的,声音播放用的QT Phonon自带的
//创建媒体对象media_object = new Phonon::MediaObject(this);Phonon::AudioOutput *audio_output = new Phonon::AudioOutput(Phonon::MusicCategory, this);Phonon::createPath(media_object, audio_output);//绑定源和接收器
一个定时刷新界面的函数:可以实现自动播放下一个声音
timer =new QTimer(this);  connect( timer, SIGNAL(timeout()), this, SLOT(NextSource()) );   timer->start(1000);  //每20毫秒刷新一次界面
刷新时判断用户操作:
void SAM::NextSource(){if(selected_a==1&&selected_b==1){selected_a=0;selected_b=0;//some ui codes hereplayed_counter++;if(played_counter>=sources.size()){QMessageBox msgBox;msgBox.setText(QString::fromLocal8Bit("测试结束\n谢谢您的参与!"));msgBox.setStyleSheet("font: 48pt \"幼圆\";background-color: rgb(0,0,0));color: rgb(255, 255, 255);");msgBox.exec();qApp->quit();std::ofstream fout("out.txt");fout<<"Log:"<<std::endl;fout<<"masker\ta\tb"<<std::endl;float masker1_suma=0,masker1_sumb=0;float masker2_suma=0,masker2_sumb=0;float masker3_suma=0,masker3_sumb=0;int masker1_counter=0,masker2_counter=0,masker3_counter=0;for(int i=0;i<sources.size();i++){fout<<source_maskers[i]<<"\t"<<source_a[i]<<"\t"<<source_b[i]<<std::endl;if(source_maskers[i]==1){masker1_suma+=source_a[i];masker1_sumb+=source_b[i];++masker1_counter;}else if(source_maskers[i]==2){masker2_suma+=source_a[i];masker2_sumb+=source_b[i];++masker2_counter;}else if(source_maskers[i]==3){masker3_suma+=source_a[i];masker3_sumb+=source_b[i];++masker3_counter;}}fout<<"\nAverage:"<<std::endl;fout<<"masker\ta\tb"<<std::endl;masker1_suma=(float)masker1_suma/masker1_counter;masker1_sumb=(float)masker1_sumb/masker1_counter;masker2_suma=(float)masker2_suma/masker2_counter;masker2_sumb=(float)masker2_sumb/masker2_counter;masker3_suma=(float)masker3_suma/masker3_counter;masker3_sumb=(float)masker3_sumb/masker3_counter;fout<<"1\t"<<masker1_suma<<"\t"<<masker1_sumb<<std::endl;fout<<"2\t"<<masker2_suma<<"\t"<<masker2_sumb<<std::endl;fout<<"3\t"<<masker3_suma<<"\t"<<masker3_sumb<<std::endl;}else{int played_index=source_orders[played_counter];media_object->setCurrentSource(sources.at(played_index));media_object->play();}}}
还有一个乱序的函数:
void SAM::RandVector(){int source_size=sources.size();for(int i=0;i<source_size;i++){bool if_order=false;while(!if_order){int tmp_order=rand()%source_size;if(source_orders[tmp_order]==-1){source_orders[tmp_order]=i;if_order=true;}}}for(int i=0;i<source_size;i++){int source_index=source_orders[i];Phonon::MediaSource current_source=sources[source_index];const std::string source_name=current_source.fileName().toStdString();if(source_name.find("masker1")<source_name.size()){source_maskers.push_back(1);}else if(source_name.find("masker2")<source_name.size()){source_maskers.push_back(2);}else if(source_name.find("masker3")<source_name.size()){source_maskers.push_back(3);}}}


工程:http://download.csdn.net/detail/xiaowei_cqu/5370789
代码:http://www.pudn.com/downloads542/sourcecode/multimedia/audio/detail2241547.html


(转载请注明作者和出处:http://blog.csdn.net/xiaowei_cqu 未经允许请勿用于商业用途)