"ファイルの書き込み​に際しデータが切り捨​てられました"と表示​される

22 vues (au cours des 30 derniers jours)
Kaede
Kaede le 12 Août 2020
Commenté : Kaede le 12 Août 2020
clear;
[p1,fs]=audioread('40kph_RN.wav');
[p2,fs]=audioread('2000rpm_Knock.wav');
fs=44100;
p2(448512,[1 2]) = [0,0];
%smix=30*p1+p2;
%soundsc(smix,fs)
%filename='mix.wav';
%audiowrite(filename,smix,fs);
Lch_p1=p1(:,1);
Rch_p1=p1(:,2);
Lch_p2=p2(:,1);
Rch_p2=p2(:,2);
smix_Lch=22*Lch_p1+Lch_p2;
%soundsc(smix_Lch,fs)
filename='mix_Lch.wav';
audiowrite(filename,smix_Lch,fs);
smix_Rch=22*Rch_p1+Rch_p2;
%soundsc(smix_Rch,fs)
filename='mix_Rch.wav';
audiowrite(filename,smix_Rch,fs);
fft_p1L=fft(22*Lch_p1);
dB_p1L=mag2db(abs(fft_p1L));
fft_p1R=fft(22*Rch_p1);
dB_p1R=mag2db(abs(fft_p1R));
fft_p2L=fft(Lch_p2);
dB_p2L=mag2db(abs(fft_p2L));
fft_p2R=fft(Rch_p2);
dB_p2R=mag2db(abs(fft_p2R));
f = (0:length(fft_p1L)-1)*fs/length(fft_p1L);
figure(1)
semilogx(f,dB_p2L)
xlim([0 fs/2])
ylim([-100,100])
xlabel('frequency[Hz]')
ylabel('Magnitude[dB]')
hold on
semilogx(f,dB_p1L)
grid on, hold off
legend('2000rpm.knock','roadnoise');
figure(2)
semilogx(f,dB_p2R)
xlim([0 fs/2])
ylim([-100,100])
xlabel('frequency[Hz]')
ylabel('Magnitude[dB]')
hold on
semilogx(f,dB_p1R)
grid on, hold off
legend('2000rpm.knock','roadnoise');
このようなプログラムを使用してディーゼルエンジンのガラガラといった音に走行騒音を重ねることでガラガラ音を聞こえにくくするという実験を行っています.そのためにLch_p1,Rch_p1に定数をかけます.1kあたりがガラガラ音になるのでこれを消そうとすると100ぐらいかける必要がありますが,"ファイルの書き込みに際しデータが切り捨てられました"と表示され,音が汚く音割れのような現象が起きます.これを防ぐ方法はありますでしょうか.
  1 commentaire
Kaede
Kaede le 12 Août 2020
追加で質問なのですがデータが切り捨てられているということはこの作成した音は原音に忠実に作成されていないということでしょうか.

Connectez-vous pour commenter.

Réponses (1)

Kojiro Saito
Kojiro Saito le 12 Août 2020
こちらのドキュメントのとおり、audiowriteの書き込み対象のデータ型によって、書き込めるデータの範囲が変わってきます。上記の変数smix_Lchsmix_Rchのデータ型を確認してみてください。
whos smix_Lch
whos smix_Rch
このコマンドのクラスにデータ型が返ってきます。
もしデータ型がuint8の場合は0以上255以下、singleやdoubleの場合は、-1.0以上+1.0以下が書き込めるデータの範囲となります。これ以外の範囲になっていると、データが切り捨てられてしまうので、原音が忠実に作成されていないことになります。
audiowriteをやる前にデータを正規化して範囲に収まるようにしてみてください。
例えば、
smix_Lch = smix_Lch / max(smix_Lch);
audiowrite(filename,smix_Lch,fs);
とか、もしsmix_Lchがマイナスの値を取るなら
smix_Lch = smix_Lch / max(abs(smix_Lch));
audiowrite(filename,smix_Lch,fs);
とかでいかがでしょうか。
  1 commentaire
Kaede
Kaede le 12 Août 2020
斎藤様いつもコメントありがとうございます.
承知いたしました.
先生に聞いたところロードノイズに定数をかけるのではなく,ガラガラ音を小さくしていくことで相対的にロードノイズを大きくできないかと言われましたのでそちらでも検討したいと考えております.

Connectez-vous pour commenter.

Catégories

En savoir plus sur MATLAB 入門 dans Help Center et File Exchange

Produits

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!