• 締切済み

javaで三角波を合成

javaでbyte配列を使って for(int i=0;i<triangle_wave.length;i++){ double s=0; for(int j=0;j<=2;j++){ double a = (2*j+1)*i*F0*Math.PI*2/Fs;(Math.sin((2*j+1)*i*F0*Math.PI*2/Fs)/(Math.pow((2*j+1),2)))); s += (double)(Math.pow((-1),j)*(Math.sin(a)/(Math.pow((2*j+1),2)))); } triangle_wave[i]= (byte)(110*8*s/(Math.pow(Math.PI,2))); } AudioFormat format = new AudioFormat((float)Fs,16,1,true,false); InputStream bytefile = new ByteArrayInputStream(triangle_wave); File file = new File("test.wav"); AudioInputStream inputstreem = new AudioInputStream(bytefile,format,wave.length); AudioSystem.write(inputstreem,AudioFileFormat.Type.WAVE,file); のような感じで三角波を作ったのですが、これをwavファイルに出力してSonicVisualiserでスペクトルを見ると基本周波数が出てきません。これはどうしてでしょうか? また、量子化ビット数を16から8にするとスペクトルに基本周波数が出てきます。量子化ビット数を2倍にすると周波数も2倍になるということなのでしょうか?

みんなの回答

  • myuki1232
  • ベストアンサー率57% (97/170)
回答No.1

ソースは読んでませんが、周波数以前に波形を見ればわかるのではありませんか?

関連するQ&A

  • java プログラム 範囲を指定した乱数

    正規乱数をボックスミューらー法で発生させて、 範囲を指定して出力したいと思ってます。 プログラムを作成してみたのですが・・・ 平均50で範囲を48から52にしたいのですが たまに範囲外というか「0.0」が出力されてしまいます。 アドバイスをください import java.util.*; public class test2{ public static void main(String args[]){ double R,S; double r[]=new double[200];  double s[]=new double[200]; double s1[]=new double[200]; Random ran=new Random();    for(int i=0;i<200;i++){     R=ran.nextDouble(); S=50+Math.sqrt(-2*Math.log(ran.nextDouble()))*Math.cos(2*Math.PI*(ran.nextDouble())); r[i]=R; s1[i]=S; if(50-2<s1[i]){ if(50+2>s1[i]){ s[i]=s1[i]; } } } for(int j=0;j<150;j++){ System.out.println(s[j]); } } } お願いします

    • ベストアンサー
    • Java
  • うまく出力されない

    #include <stdio.h> #include <math.h> int main(void) { int j=0; double t,i[500]; for(t=0;t<=20*pow(10,-3);t=t+(0.04*pow(10,-3)) ){ i[j]=(3.9*pow(10,-12)*5*pow(10,3)*(sin(314*(t+(0.04*pow(10,-3))))-sin(314*t)))/(0.04*pow(10,-3)); printf("%3d %1.10f\n",j,i[j]); j++; } } これを出力させたところ、202番以降からしか表示されませんでした。 これはなぜなのでしょうか? 分かる方がいたら、ぜひ、解決法を教えてもらえませんか? 宜しくお願いします。

  • FFTのソースについて

    512個のデータに対してFFTをかけ、変換後の絶対値を得たいのですが矢印の部分でプログラムがとまり、特にエラーメッセージも出ません。 原因がわかりません。申し訳ありませんが、よろしくお願いします。 void FFT(int x[], int y[]) {    int d, dn, pow, m, j1, j2, exp2, j , k, ndv2, t, flags= 1;    int n_data = 0, dnumb = 512, nf, jk;    double w, arg, c, s, t1, t2, t0, dt, ana, anb, answer;    double [] xr = new double[512];    double [] xi = new double[512]; dn=dnumb; w=6.283185303/dnumb; pow=exp2(dnumb); *2の何乗かを計算するメソッドです for(t = 0; t < 512; t++){ if(t < 500) xr[t] = x[t]; else xr[t] = xr[499]; xi[t] = 0; } for(int i=1; i<=pow ; i++) { m=dn; dn=dn/2; arg=0; for(int j=1; j<=dn; j++) { c=Math.cos(arg); s=-flags*Math.sin(arg); arg=arg+w; k=m; while(k<=dnumb) { j1=k-m+j; j2=j1+dn; →→→→→→→  t1=xr[j1]-xr[j2]; t2=xi[j1]-xi[j2]; xr[j1]=xr[j1]+xr[j2]; xi[j1]=xi[j1]+xi[j2]; xr[j2]=c*t1+s*t2; xi[j2]=c*t2-s*t1; k=k+m; } } w=2*w; } j=1; ndv2=dnumb/2; for(int i=1; i<=(dnumb-1); i++) { if(i<j) { t1=xr[j]; t2=xi[j]; xr[j]=xr[i]; xi[j]=xi[i]; xr[i]=t1; xi[i]=t2; } k=ndv2; while(k<j) { j=j-k; k=k/2; } j=j+k; } for(t = 0; t < 512; t++){ ana = Math.pow(xr[t], 2); anb = Math.pow(xi[t], 2); answer = Math.pow(ana + anb, 0.5); } if (flags==1) { for(int j=1; j<=dnumb; j++) { xr[j]=xr[j]/dnumb; xi[j]=xi[j]/dnumb; } } }

    • ベストアンサー
    • Java
  • 先に計算したほうがいいのでしょうか?

    下記のプログラムを作ったのですが、 Math.PI / 180 の部分は先に計算しておいたほうが処理が 早くなると言われたのですがそうなのでしょうか? 先に掛け算をしないといけないような気がするのですが。 import java.awt.Color; import java.awt.Graphics2D; import java.awt.image.BufferedImage; import java.io.File; import javax.imageio.ImageIO; import java.lang.Math; public class Test9 { public static void main(String[] args) { int r = (args.length > 0)? Integer.parseInt(args[0]):100; int n = (args.length > 1)? Integer.parseInt(args[1]):16; int x, y, x1, y1; try { BufferedImage image=new BufferedImage(r*2+10,r*2+10,BufferedImage.TYPE_INT_RGB); Graphics2D g2d=image.createGraphics(); g2d.setBackground(Color.WHITE); g2d.clearRect(0,0,r*2+10,r*2+10); g2d.setColor(Color.BLACK); for ( double i = 0.0; i < 360.0; i += 360.0 / n ) { x1 = (int) ( r * Math.cos( i * Math.PI / 180 ) ); y1 = (int) ( r * Math.sin( i * Math.PI / 180 ) ); for( double j = i + 360 / n; j < 360.0; j += 360.0 / n ) { x = (int) ( r * Math.cos( j * Math.PI / 180 ) ); y = (int) ( r * Math.sin( j * Math.PI / 180 ) ); g2d.drawLine( x1 + r + 5, y1 * (-1) + r + 5, x + r + 5, y * (-1) + r + 5 ); } } ImageIO.write(image, "JPEG", new File("c:\\test9.jpg")); } catch(Exception e) { e.printStackTrace(); } } }

    • ベストアンサー
    • Java
  • javaの図形なのですが

    javaの図形なのですが、結果が球の形にそってぐるぐるっと リンゴの皮むきのような感じの線になるはずなのですが動かない、 というよりもどこを修正すればいいのか見当もつかずさまよっています。正直、助けていただきたいです。 たぶん抜けてるところがあるはずなんですが、何が抜けてて何を入れれば良いかわからないので教えてほしいです。 import javax.swing.*; import java.awt.*; import java.awt.event.*; public class ui {public static void main(String[] args) { JFrame jf = new JFrame("ui"); MyCanvas mc = new MyCanvas(); mc.setPreferredSize(new Dimension(700,700)); jf.getContentPane().add(mc); jf.pack(); jf.setVisible(true); } } class MyCanvas extends JPanel { static double [][] p = { {ここに数値を入れるのですが多いので投稿できないので省きます} }; double _xa = 30; double _ya = 40; int doX, doY; public void paintComponent( Graphics g ) { super.paintComponent(g); setBackground(Color.black); g.setColor(Color.white); disp_3Dobj(_xa, _ya, getWidth()/2, getHeight()/2, g);( } void disp_3Dobj(double xa, double ya, int px, int py, Graphics g) { int [] p2d; int n = p[0].length; for (int i = 0; i < n; i++) { } } int [] get2Dpos(double x, double y, double z, double xa, double ya, int px, int py) { final double D2Rad = Math.PI/180.0; double a = xa*D2Rad, b = ya*D2Rad; double x1, y1, zt; double sinA = Math.sin(a), sinB = Math.sin(b); double cosA = Math.cos(a), cosB = Math.cos(b); int [] pos = new int[2]; x1 = x*cosB + z*sinB; zt = -x*sinB + z*cosB; y1 = y*cosA - zt*sinA; pos[0] = px+(int)Math.rint(x1); pos[1] = py-(int)Math.rint(y1); return pos;}}

  • WAVEファイルが音飛びする?

    純音の WAVE ファイルを作りたいのですが、 作った WAVE ファイルを Win2000 + Windows media player ver 7.01 で 再生すると、純音は聞こえるのですが音飛びします。 視覚エフェクト->スモークライン では音飛びしている間も 波形が出ているように見えます。 原因はなんなのでしょうか? 波形データは、↓のプログラムで作りました。 周波数やボリューム、時間を変えても音飛びする間隔が変わるだけです。 ------------------------- rate = 48000; freq = 1000; time = 48000; volume = 64; for(i=0;i<time;i++){ value[i] = (short)(sin((double)freq*2*M_PI*i/rate)*volume); }

  • ガウス関数を少しずつずらして足し上げるプログラム

    ある値をある検出器に入力したときに出力結果がその入力したを中心にガウス関数のように広がってしまう場合を考え,ある関数の値を小刻みに入力したとき、その関数が出力されたときそれぞれ値のガウス関数の広がりにより重ね合わされてどのように見えるか数値計算してみようと思い、以下のソースコードを書いて見ました。行列で考えてそれぞれの値の寄与を足しあげて見ようとしたのしたのですが、実行結果をみると明らかにおかしい10^19などの数値が見られます。これはなぜでしょうか。私のソースコードのどこに問題があるのでしょうか。お手数をお掛けしますが回答よろしくおねがいします。 インデントが反映されていませんでしたらすみません。 ---------------------------ソースコード------------------------------------------ #include<stdio.h> #include <stdlib.h> #include<math.h> #define N 100 #define f(x) pow(x,-1.7) //この関数が検出器に入力したときどのように見えるか知りたい// void mat_product(double ec[N],double r[N][N],double e[N]) { int i,j; for(i=0; i<N; i++){ for(j=0; j<N;j++){ ec[i]+=r[i][j]*e[j]; } } } int main(void) { int i,j; double ec[N],r[N][N],e[N]; double max,min, ei,E,sigma,min1,min2,m,pi; sigma=0.08; //keV// max=10.5; min=0.5; min1=0.5; min2=0.5; m=0.5; ei=(max-min)/N; pi=3.141592; for(i=0; i<N ;i++){ for(j=0; j<N ;j++){ r[j][i]=(1/(pow(2*pi,0.5)*sigma))*exp(-1*pow(m-min1,2)/(2*pow(sigma,2))); m+=ei; } e[i]=f(min2); m=0.5; min1+=ei; min2+=ei; } mat_product(ec,r,e); for(i=0; i<N; i++){ printf("%g\t%g\n",min,ec[i]); min+=ei; } return 0; } ---------------------------出力結果--------------------------------- 0.5 22.0512 0.6 23.8139 0.7 18.9 0.8 14.9642 0.9 12.1864 1 10.1512 1.1 8.60991 1.2 7.4112 1.3 6.45833 1.4 5.68688 1.5 5.05253 1.6 4.52387 1.7 4.07814 1.8 3.69846 1.9 3.37209 2 3.08926 2.1 2.84239 2.2 2.62547 2.3 2.43375 2.4 2.26337 2.5 2.1112 2.6 1.66592 2.7 1.85166 2.8 1.7404 2.9 1.63941 3 1.54742 3.1 1.46337 3.2 1.38635 3.3 1.31558 3.4 4.47979e+30 3.5 1.19017 3.6 1.13444 3.7 1.08275 3.8 1.0347 3.9 0.989949 4 0.9482 4.1 0.909181 4.2 0.872652 4.3 0.838401 4.4 0.806238 4.5 0.775991 4.6 0.747509 4.7 0.720652 4.8 0.695296 4.9 0.671329 5 0.648648 5.1 0.627161 5.2 0.606783 5.3 0.587437 5.4 0.569053 5.5 0.551566 5.6 0.534917 5.7 0.519053 5.8 0.503924 5.9 0.489483 6 0.475689 6.1 0.462502 6.2 0.449887 6.3 0.437809 6.4 0.426239 6.5 0.415146 6.6 0.404506 6.7 0.394292 6.8 0.384482 6.9 0.375054 7 0.365988 7.1 0.357265 7.2 0.348868 7.3 0.34078 7.4 0.332986 7.5 0.325471 7.6 0.318222 7.7 0.311226 7.8 0.304472 7.9 0.297947 8 0.291642 8.1 0.285546 8.2 0.27965 8.3 0.273945 8.4 -0.0404521 8.5 0.263075 8.6 0.257894 8.7 0.252874 8.8 0.248007 8.9 0.243288 9 0.238709 9.1 7.46629e+19 9.2 0.229953 9.3 0.225764 9.4 0.221696 9.5 0.217743 9.6 0.2139 9.7 0.210164 9.8 0.206531 9.9 0.202996 10 0.199557 10.1 0.196209 10.2 0.192868 10.3 0.185672 10.4 0.140717

  • Writer & PrintWriter

    import java.io.*; public class JavaIO4 { public static void main(String args[]) throws Exception { Writer w=new FileWriter(args[0]); PrintWriter pw=new PrintWriter(w); for (int i=0; i<=330; i+=30) { double atai=Math.sin(Math.PI*i/180.0); String str="sin("+i+")="+atai+"\n"; pw.write(str); } pw.close(); } } と import java.io.*; public class JavaIO4 { public static void main(String args[]) throws Exception { //Writer w=new FileWriter(args[0]); PrintWriter pw=new PrintWriter(args[0]); for (int i=0; i<=330; i+=30) { double atai=Math.sin(Math.PI*i/180.0); String str="sin("+i+")="+atai+"\n"; pw.write(str); } pw.close(); } } の結果が同じになるんですけど、 Writer w = new FileWriter(args[0]); PrintWriter pw = new PrintWriter(w); とするのはなぜなんですか? 何か意味はあるんですか?

  • 離散コサイン変換について

    Webにあるサンプルソースや書籍のソースを見て、 感じの違うソースなのですが、 以下のソースはDCTになっているのでしょうか? 書籍には、 Data[N]=1.2.3[.3.2.1<-付け足] して、2NでDFTすればよいとありました。 ですが、式を見てもそういう記述にはなっていません。 よろしくお願いします。 #include<stdio.h> #define _USE_MATH_DEFINES #include<math.h> int main() { double *Data; double *DataAfter; double *DataConvert; int DataLen; DataLen=16; Data=new double[DataLen*2]; DataAfter=new double[DataLen*2]; DataConvert=new double[DataLen*2]; for(int i=0;i<DataLen;i++) { Data[i]=1.5*i; } for(int i=0;i<DataLen;i++) { Data[DataLen+i]=Data[DataLen-1-i]; } for(int i=0;i<DataLen*2;i++) { DataAfter[i]=0; for(int j=0;j<DataLen*2;j++) { DataAfter[i]+=1.0*Data[i]*cos(M_PI*i*j/(DataLen*2)); } DataAfter[i]/=DataLen; } for(int i=0;i<DataLen*2;i++) { DataConvert[i]=0; for(int j=0;j<DataLen*2;j++) { DataConvert[i]+=1.0*DataAfter[i]*cos(-M_PI*i*j/(DataLen*2)); } DataConvert[i]*=DataLen; } for(int i=0;i<DataLen*2;i++) { printf("%d %f\t%d %f\t%d %f\n",i,Data[i],i,DataAfter[i],i,DataConvert[i]); } delete[] Data; delete[] DataAfter; delete[] DataConvert; getchar(); return 0; }

  • C言語 正弦関数の級数展開

    はじめまして。 sinxの級数展開を7項まで取った場合と組み込み関数で求めたsinxの値の差を,0度から360度まで,プログラムを作成して求めよ、という問題があるのですが、300度まででとまってしまいます。 どなたか、わかる方がいまいたら、教えてください。 以下リストです。 #include <stdio.h> #include<conio.h> #include <math.h> const double pi=atan(1.0)*4; double kaijyo(int n) { double ret=1; for (int i=2;i<=n;i++) { ret*=i; } return ret; } double polSin(double theta,int order) { int i; double ret=theta; for (i=1;i<order;i++) { if (i%2==1) { ret-=pow(theta,(i*2+1))/kaijyo(i*2+1); } else { ret+=pow(theta,(i*2+1))/kaijyo(i*2+1); } } return ret; } int main() { int order=7; double rad,theta,trueVal,polVal; for (theta=0;theta<360;theta+=1.0) { rad=theta/180*pi; trueVal=sin(rad); polVal=polSin(rad,order); printf("%e\n",polVal-trueVal); } getch(); return 0; }